递归替换文件中第n次出现的字符串



我需要替换文件中第n次出现的字符串。

情况是这样的:

我在文件中有1000次Acme,我设法通过获得了这个数字

find . -type f -exec cat {} + | grep -c 'Acme'

我还能够通过替换所有出现的Acme

grep -rl 'Acme' ./ | LC_ALL=C xargs sed -i '' 's/Acme/NotAcme/g'

然而,当我试图只替换第n次出现时,我会遇到困难(例如,只替换Acme的前100次出现。

我发现最远的是通过迭代Acme的所有出现

grep -roh Acme . | wc -w

到目前为止,还没有找到迭代和替换第n次出现的Acme的方法。

任何帮助都将不胜感激。谢谢

$ awk '/Acme/ && ++n <= 4 { sub(/Acme/, "Notacme") } { print }' test 
1 Notacme
2 Notacme
3 Notacme
FOO
4 Notacme
5 Acme
6 Acme
BAR
7 Acme
8 Acme

这是有效的。只需将4替换为";N〃;

仅替换前100次出现的Acme:

您可以使用以下find | gnu-awk解决方案:

find . -type f -exec awk -v RS='Acme' -v repl='NotAcme' -v n=100 '{
ORS = (NR <= n ? repl : RT)} 1' {} ;

此awk命令将Acme设置为记录分隔符,使awk能够在每次出现字符串Acme时拆分记录。我们在变量n中保持替换100的最大计数。当当前记录计数NR小于等于n时,我们输出repl,否则我们输出与RS匹配的值相同的RT

最新更新