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_[occurence number]' 替换。

4

3 回答 3

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

Solaris上使用gawknawk/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

编辑:

我又迟到了一天,又少了一分钱;-(


编辑2:

字符编码是另一件需要注意的事情...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 回答