我需要替换文件中第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