使用sed或awk列举替换的方法

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_[出现次数]'。


需要更多的解释,特别是输入格式,才能让任何人尝试有意义地回答这个问题...我假设你已经模拟了一个旨在简化但代表真实世界文件的样本...那个文件是什么? 日志文件? Mysql日志文件?只是猜测。谢谢。 Keith. - corlettk
实际上这是一个Java源文件,转换是用来使方法名唯一的。 - Michael Locher
大家好,感谢你们提供的解决方案。我稍微修改了一下问题,增加了一些关于foo的噪声。 - Michael Locher
是的,程序员在想要完成一些任务时常常会使用perl、awk、nawk、ed、sed和/或tr,这不是很有趣吗;-) - corlettk
3个回答

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

Solaris 上使用 gawknawk 或者 /usr/xpg4/bin/awk


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实用程序仍然不支持字符集。


0

这是另一种表达radoulov答案的方式

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

在查找“foo”时,您应该注意不要匹配到“foobar”:

gawk '/\<foo\>/ {sub(/\<foo\>/, "&_" sprintf("%02d",++c))} 1' 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接