如何用BASH中的递增数替换所有匹配?

Vil*_*age 8 bash sed

我有这样的文本文件:

AAAAAA this is some content.
This is AAAAAA some more content AAAAAA. AAAAAA
This is yet AAAAAA some more [AAAAAA] content.
Run Code Online (Sandbox Code Playgroud)

我需要AAAAAA用递增的数字替换所有出现的,例如,输出看起来像这样:

1 this is some content.
This is 2 some more content 3. 4
This is yet 5 some more [6] content.
Run Code Online (Sandbox Code Playgroud)

如何用递增的数字替换所有匹配?

jay*_*ngh 16

这是一种方法:

$ awk '{for(x=1;x<=NF;x++)if($x~/AAAAAA/){sub(/AAAAAA/,++i)}}1' file
1 this is some content.
This is 2 some more content 3. 4
This is yet 5 some more [6] content.
Run Code Online (Sandbox Code Playgroud)

  • 谢谢@EdMorton.没错,我猜的原始问题后来被修改为仅显示6 A的集合.删除了第二个建议. (2认同)

ric*_*ici 5

Perl 解决方案:

perl -pe 'BEGIN{$A=1;} s/AAAAAA/$A++/ge' test.dat
Run Code Online (Sandbox Code Playgroud)

  • @EdMorton:Perl 可以双向摇摆。`e` 标志的意思是“每次评估替换”。如果我写了 `s/AAAAAA/{$A++}/g`,我会得到不同的结果。(在 Python 中,您可以编写 `re.sub("A{6}",string,callable)` 但如果您希望可调用函数做一些有趣的事情,您可能需要定义它;对于一个人来说这不是一个方便的接口 - Lua 是另一种可能性——它还允许可调用对象作为替换,并且具有更方便的语法——但不幸的是,大多数发行版上都没有默认安装它。 (2认同)