我需要在目录中搜索具有特定模式的文件(例如foobar
)并将其替换为foobarXXX
,其中XXX
是数字。例如有两个原始文件
snt130.txt
我的女主人的眼睛一点也不像富巴;
富巴比她嘴唇的红还要红;
snt18.txt
我可以将你比作夏日吗?
你更加可爱更加富巴:
处理后我需要这样的东西(数字的顺序并不重要,只是唯一性)
snt130.txt
我的女主人的眼睛一点也不像foobar001;
foobar002比她嘴唇的红还要红;
snt18.txt
我可以将你比作夏日吗?
你更加可爱更加foobar003:
执行此搜索和替换任务的最简单方法是什么(最好使用bash
)
答案1
$ cat f1
My mistress' eyes are nothing like foobar;
foobar is far more red than her lips' red;
$ cat f2
Shall I compare thee to a summer's day?
Thou art more lovely and more foobar:
和perl
$ perl -i -pe 's/foobar\K/sprintf "%03d", ++$i/ge' f1 f2
$ cat f1
My mistress' eyes are nothing like foobar001;
foobar002 is far more red than her lips' red;
$ cat f2
Shall I compare thee to a summer's day?
Thou art more lovely and more foobar003:
- 未初始化变量的默认值
0
在数字上下文中 e
修饰符允许在替换部分使用 Perl 代码foobar\K
要替换的字符串,\K
在这里只是为了方便使用
具有gawk
就地扩展并假设每行只有一个字符串实例
gawk -i inplace -v s='foobar' '$0 ~ s{sub(s, sprintf("%s%03d", s, ++i))} 1' f1 f2