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

47,411

Solution 1

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.

Solution 2

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.

Share:
47,411

Related videos on Youtube

dnkb
Author by

dnkb

Updated on September 17, 2022

Comments

  • dnkb
    dnkb over 1 year

    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?

  • Dennis Williamson
    Dennis Williamson almost 14 years
    From 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 across sed' 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."
  • bpa
    bpa almost 14 years
    Info files... I hate them. Anyway, I removed the ambiguous part. Good comment, +1.
  • dnkb
    dnkb almost 14 years
    Thanks, mrucci and Dennis. I thought that there must be something simple out there.
  • AlexCheuk
    AlexCheuk about 12 years
    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. ;)