假设有一个包含多行文本的纯文本文件
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
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
编辑:
我又迟到了一天,而且还差了一分钱;-(
编辑2:
字符编码是另一件需要注意的事情... Java源代码不一定是系统默认编码...它通常是UTF-8编码,以允许任何嵌入的“高阶实体”;-) 许多*nix实用程序仍然不支持字符集。
这是另一种表达radoulov答案的方式
awk '/foo/ {sub(/foo/, "&_" sprintf("%02d",++c))} 1' infile
在查找“foo”时,您应该注意不要匹配到“foobar”:
gawk '/\<foo\>/ {sub(/\<foo\>/, "&_" sprintf("%02d",++c))} 1'