Raoul
Raoul

Reputation: 331

How to replace the nth occurrence of a string using sed

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

Answers (2)

ESW2409
ESW2409

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

dogbane
dogbane

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

Related Questions