I need to replace the string of n-th occurrences that exists inside files.
The case is like this:
I have 1,000 occurrences of Acme
inside files, which I managed to obtain the number through:
find . -type f -exec cat {} | grep -c 'Acme'
I also had been able to replace all occurrences of Acme
through:
grep -rl 'Acme' ./ | LC_ALL=C xargs sed -i '' 's/Acme/NotAcme/g'
However, I face difficulty when I try to only replace the n-th occurrences (E.g. Only replace the first 100 occurrences of Acme
.
The furthest I found is to iterate through all the occurrences of Acme
through:
grep -roh Acme . | wc -w
Haven't found the way to iterate and replace the n-th occurrences of Acme
so far.
Any help will be appreciated. Thanks!
CodePudding user response:
Only replace the first 100 occurrences of
Acme
:
You may use this find | gnu-awk
solution:
find . -type f -exec awk -v RS='Acme' -v repl='NotAcme' -v n=100 '{
ORS = (NR <= n ? repl : RT)} 1' {} \;
This awk command sets Acme
as record separator, enabling awk
to split records on each occurrence of string Acme
. We keep a max count of replacements 100
in variable n
. When current record count NR
is less than equal to n
then we output repl
otherwise we output RT
which is same as value matched by RS
CodePudding user response:
$ 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
THis works. Just replace 4 with "N"