replace nth occurence of string in each line of a text file

15

4

I have large text files with space delimited strings (2-5). The strings can contain "'" or "-". I'd like to replace say the second space with a pipe.

What's the best way to go?

Using sed I was thinking of this:

sed -r 's/(^[a-z'-]+ [a-z'-]+\b) /\1|/' filename.txt

Any other/better/simpler ideas?

dnkb

Posted 2010-05-20T16:12:18.727

Reputation: 347

Answers

21

You can add a number at the end of the substitute command. For example, the following will substitute the second occurrence of old with the string new on each line of file:

sed 's/old/new/2' file

So, instead of your proposed solution, you can use:

sed 's/ /|/2'

For more information, see e.g. this sed tutorial.

mrucci

Posted 2010-05-20T16:12:18.727

Reputation: 8 398

2From the sed info file: "Note: the POSIX standard does not specify what should happen when you mix the g' and NUMBER modifiers, and currently there is no widely agreed upon meaning acrosssed' implementations. For GNU `sed', the interaction is defined to be: ignore matches before the NUMBERth, and then match and replace all matches from the NUMBERth on." – Paused until further notice. – 2010-05-20T17:29:16.450

Info files... I hate them. Anyway, I removed the ambiguous part. Good comment, +1. – mrucci – 2010-05-20T20:52:58.127

1Thanks, mrucci and Dennis. I thought that there must be something simple out there. – dnkb – 2010-05-22T15:58:54.760

It seems every problem I have with text manipulation, I manage to solve with sed. I'm not sure I should be thanking you for making sed even more useful to me, but I will anyway. ;) – Jamie – 2012-04-25T15:39:25.737

1

Did you try your version? Did it work? Because I think it is basically a good idea. I would do slightly differently, though:

sed -re 's/^([^ ]+ +[^ ]+) /\1|/'

This will accept any characters in a word that is not space, and will accept more than one spaces between the first two words.

petersohn

Posted 2010-05-20T16:12:18.727

Reputation: 2 554