3

行のあるプレーンテキストファイルが与えられた

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_[発生番号]」に置き換えられます。

4

3 に答える 3

2
awk '!/foo/||sub(/foo/,"&_"++_)' infile

Solarisではgawk、nawk 、または/ usr / xpg4 / bin/awkを使用します。

于 2009-05-19T13:31:50.653 に答える
1

これはおそらくあなたが必要とするものではありませんが、それは正しい方向にいくつかのアイデアを与えるかもしれません。

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ユーティリティまだ文字セットを認識していません。

于 2009-05-19T12:17:52.270 に答える
0

これはradoulovの答えを表現する別の方法です

awk '/foo/ {sub(/foo/, "&_" sprintf("%02d",++c))} 1' infile

「foo」を探すときは、「foobar」と一致しないように注意する必要があります。

gawk '/\<foo\>/ {sub(/\<foo\>/, "&_" sprintf("%02d",++c))} 1' 
于 2009-05-19T19:47:45.010 に答える