Reputation: 331
Is there any way to replace the nth occurrence of a string in a file using sed?
I'm using sed -i '0,/jack.*/ s//jill/'
to replace the first occurrence.
How can i change it so that it replaces the nth occurrence?
My file contents the following lines:
first line
second line
third line
jack=1
fifth line
jack=
seventh line
I don't know the value after jack=
, it can be anything or nothing.
I want to replace the 2nd occurrence of jack=
and anything that follows it with jill
.
Upvotes: 26
Views: 44512
Reputation: 21
Try this, sed ':a;N;$!ba;s/word1/word2/n' filename
Here, :a;N;$!ba
is used to load the entire file into memory, line by line, so that sed
can process the whole file in a single pass. The s/word1/word2/N
substitution then replaces every Nth occurrence of word1
with word2
.
Upvotes: 2
Reputation: 274878
First replace all the newlines with a unique character that does not occur anywhere else in your file (e.g. ^
) using tr
. You need to do this in order to create a single string for sed
. Then pass it to sed
and tell it to replace the nth occurrence of your string. Finally, pass the output back through tr
to recreate the newlines.
For n=2, the command is:
$ tr '\n' '^' < file | sed 's/jack/jill/2' | tr '^' '\n'
first line
second line
third line
jack
fifth line
jill
seventh line
Update:
It can also be done with sed
, WITHOUT changing the newlines first, using the following command:
$ sed ':a;N;$!ba;s/jack/jill/2' file
Alternatively, use awk
:
$ awk '/jack/{c+=1}{if(c==2){sub("jack","jill",$0)};print}' file
Upvotes: 32