文字列のnの位置から始まる同様のテキストセットを文字列に置き換え、それ以外の場合は値を+ 1だけ増やします。

文字列のnの位置から始まる同様のテキストセットを文字列に置き換え、それ以外の場合は値を+ 1だけ増やします。

たとえば、次の行を含むテキストファイルがあります。

入力する

DD0TRANSID000019021210504250003379433005533665506656000008587201902070168304000.0AK  0000L00000.00  N          01683016832019021220190212N0000.001683065570067.000000.00000.0000000000000NAcknowledgment                                                                                                                                        
DD0TRANSID000019021210504250003379433005535567606656000008587201902085381804000.0FC  0000L00000.00  N          53818538182019021220190212N0000.053818065570067.000000.00000.0000000000000NFirst Contact                                                                                                                                         
DD0TRANSID000019021210510360003379433005535568006656000008587201902085381804000.0SR  0000L00000.00  N          53818538182019021220190212N0000.0
CC0TRANSID000019021210510360003379433005535568006656000008587201902085381804000.0SR  0000L00000.00  N          53818538182019021220190212N0000.0

私の要件は、行が「D」で始まる場合、14番目の位置から27番目の位置までの文字列をD00000Xに置き換えることです(Xは左詰めの数字です)。

ファイル内の以前に見つかった場所14と27の間に同じ文字列値がある場合は、それをD00000Xに置き換える必要があり、そうでない場合はD00000X + 1に置き換える必要があります。

出力

DD0TRANSID00001902121D000006003379433005533665506656000008587201902070168304000.0AK  0000L00000.00  N          01683016832019021220190212N0000.001683065570067.000000.00000.0000000000000NAcknowledgment                                                                                                                                        
DD0TRANSID00001902121D000006003379433005535567606656000008587201902085381804000.0FC  0000L00000.00  N          53818538182019021220190212N0000.053818065570067.000000.00000.0000000000000NFirst Contact                                                                                                                                         
DD0TRANSID00001902121D000007003379433005535568006656000008587201902085381804000.0SR  0000L00000.00  N          53818538182019021220190212N0000.0
CC0TRANSID000019021210510360003379433005535568006656000008587201902085381804000.0SR  0000L00000.00  N          53818538182019021220190212N0000.0

ベストアンサー1

これが日付/タイムスタンプであり、順次増加すると仮定します。

a=($(grep -Po "(?<=^D.{13}).{13}" testfile | uniq))
for ((i=0; i<${#a[@]}; i+=1)); do
    s=${a[$i]}
    sed -E -i "s/(D.{13})$s/\1${s:0:7}D$(printf '%06d' $((i+1)))/g" testfile
done

マークがファイル内でさらに繰り返されると、新しいカウンタインクリメントが得られます。これを望まない場合は、ファイル全体で同じタグに同じカウンタを適用するuniq必要があります。sort | uniq

ちなみに、あなたの例では、位置28から0を削除したようです。

おすすめ記事