Bashを使用してファイルで「増分」交換を実行する方法

Bashを使用してファイルで「増分」交換を実行する方法

特定のパターン(たとえば)を含むファイルをディレクトリから検索してにfoobar置き換える必要がありますfoobarXXX。ここでXXX、は数値です。たとえば、元のファイルが2つあります。

snt130.txt

私の女主人の目はまったく似ていません。プヴァ;
プヴァ彼女の唇の赤色よりも赤い。

snt18.txt

あなたを夏の日に例えてもいいですか?
君はもっと可愛くて可愛いプヴァ:

処理後は次のようなものが必要です(数字の順序は重要ではなく、一意性のみが必要です)。

snt130.txt

私の女主人の目はまったく似ていません。foob​​ar001;
foob​​ar002彼女の唇の赤色よりも赤い。

snt18.txt

あなたを夏の日に例えてもいいですか?
君はもっと可愛くて可愛いfoob​​ar003:

この検索と置換操作を実行する最も簡単な方法は何ですか(使用するのが最善ですbash

答え1

$ cat f1
My mistress' eyes are nothing like foobar;
foobar is far more red than her lips' red;
$ cat f2
Shall I compare thee to a summer's day?
Thou art more lovely and more foobar:

そしてperl

$ perl -i -pe 's/foobar\K/sprintf "%03d", ++$i/ge' f1 f2
$ cat f1
My mistress' eyes are nothing like foobar001;
foobar002 is far more red than her lips' red;
$ cat f2
Shall I compare thee to a summer's day?
Thou art more lovely and more foobar003:
  • 0数値コンテキストで初期化されていない変数のデフォルト値
  • eModifierを使用すると、交換部品にPerlコードを使用できます。
  • foobar\K置き換える文字列は\K便宜上ここにあります。


gawk内部拡張があり、1行に1つの文字列インスタンスのみを想定しています。

gawk -i inplace -v s='foobar' '$0 ~ s{sub(s, sprintf("%s%03d", s, ++i))} 1' f1 f2

関連情報