たとえば、次の行を含むテキストファイルがあります。
入力する
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を削除したようです。