テキスト ファイルで文字列を検索し、一致するたびに増加する数値を含む置換を作成する必要があります。
「見つかった」文字列は、単一の文字、単語、またはフレーズである可能性があります。
置換式は (以下の例のように) 常に同じではありませんが、増分する数値 (変数) が常に含まれます。
例えば:
1) 「data.txt」という名前のテスト ファイルがあります。ファイルには次が含まれます。
Now is the time
for all good men
to come to the
aid of their party.
2) awk スクリプトを「cmd.awk」という名前のファイルに配置しました。ファイルには次が含まれます。
/f/ {sub ("f","f(" ++j ")")}1
3) awk を次のように使用します。
awk -f cmd.awk data.txt
この場合、出力は期待どおりです。
Now is the time
f(1)or all good men
to come to the
aid of(2) their party.
問題は、行に複数の一致がある場合に発生します。たとえば、次のような文字「i」を検索していたとします。
/i/ {sub ("i","i(" ++j ")")}1
出力は次のとおりです。
Now i(1)s the time
for all good men
to come to the
ai(2)d of their party.
「時間」または「彼ら」に「i」が含まれていないため、これは間違っています。
そこで、次のように「sub」の代わりに「gsub」を試しました。
/i/ {gsub ("i","i(" ++j ")")}1
出力は次のとおりです。
Now i(1)s the ti(1)me
for all good men
to come to the
ai(2)d of thei(2)r party.
今度は文字 "i" のすべての出現を置換しますが、挿入される数字は同じ行のすべての一致に対して同じです。
望ましい出力は次のようになります。
Now i(1)s the ti(2)me
for all good men
to come to the
ai(3)d of thei(4)r party.
注: 番号は常に「1」で始まるとは限らないため、次のように awk を使用する場合があります。
awk -f cmd.awk -v j=26 data.txt
出力を取得するには:
Now i(27)s the ti(28)me
for all good men
to come to the
ai(29)d of thei(30)r party.
明確にするために、置換の数値は常に括弧内にあるとは限りません。また、置換には常に一致した文字列が含まれるとは限りません (実際には非常にまれです)。
これで私が抱えている他の問題は...
「検索文字列」に awk 変数 (環境変数ではない) を使用したいので、awk コマンドラインで指定できます。
例えば:
1) awk スクリプトを「cmd.awk」という名前のファイルに配置しました。ファイルには次のようなものが含まれています。
/??a??/ {gsub (a,a "(" ++j ")")}1
2) awk を次のように使用します。
awk -f cmd.awk -v a=i data.txt
出力を取得するには:
Now i(1)s the ti(2)me
for all good men
to come to the
ai(3)d of thei(4)r party.
ここでの質問は、/search/ 式で変数 "a" をどのように表すかということです。