如何使用 bash 在文件中进行“增量”替换

如何使用 bash 在文件中进行“增量”替换

我需要在目录中搜索具有特定模式的文件(例如foobar)并将其替换为foobarXXX,其中XXX是数字。例如有两个原始文件

snt130.txt

我的女主人的眼睛一点也不像富巴
富巴比她嘴唇的红还要红;

snt18.txt

我可以将你比作夏日吗?
你更加可爱更加富巴

处理后我需要这样的东西(数字的顺序并不重要,只是唯一性)

snt130.txt

我的女主人的眼睛一点也不像foob​​ar001
foob​​ar002比她嘴唇的红还要红;

snt18.txt

我可以将你比作夏日吗?
你更加可爱更加foob​​ar003

执行此搜索和替换任务的最简单方法是什么(最好使用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

相关内容