行のあるプレーンテキストファイルが与えられた
bli foo bla
abc
dfg
bli foo bla
hik
lmn
sedまたはawkの魔法がそれをに変換するもの
bli foo_01 bla
abc
dfg
bli foo_02 bla
hik
lmn
そのため、「foo」が出現するたびに「foo_[発生番号]」に置き換えられます。
行のあるプレーンテキストファイルが与えられた
bli foo bla
abc
dfg
bli foo bla
hik
lmn
sedまたはawkの魔法がそれをに変換するもの
bli foo_01 bla
abc
dfg
bli foo_02 bla
hik
lmn
そのため、「foo」が出現するたびに「foo_[発生番号]」に置き換えられます。
awk '!/foo/||sub(/foo/,"&_"++_)' infile
Solarisではgawk、nawk 、または/ usr / xpg4 / bin/awkを使用します。
これはおそらくあなたが必要とするものではありませんが、それは正しい方向にいくつかのアイデアを与えるかもしれません。
Administrator@snadbox3 ~
$ cd c:/tmp
Administrator@snadbox3 /cygdrive/c/tmp
$ cat <<-eof >foo.txt
> foo
> abc
> dfg
> foo
> hik
> lmn
> eof
Administrator@snadbox3 /cygdrive/c/tmp
$ awk '/^foo$/{++fooCount; print($0 "_" fooCount);} /^ /{print}' foo.txt
foo_1
abc
dfg
foo_2
hik
lmn
編集:
私は1日遅れて、ペニーショートです;-(
EDIT2:
文字エンコードも注意が必要です...Javaソースコードは必ずしもシステムのデフォルトエンコーディングに含まれているとは限りません...埋め込み「高次エンティティ」を許可するためにUTF-8エンコードを終了します;-)多くの*nixユーティリティまだ文字セットを認識していません。
これはradoulovの答えを表現する別の方法です
awk '/foo/ {sub(/foo/, "&_" sprintf("%02d",++c))} 1' infile
「foo」を探すときは、「foobar」と一致しないように注意する必要があります。
gawk '/\<foo\>/ {sub(/\<foo\>/, "&_" sprintf("%02d",++c))} 1'