replace nth occurence of string in each line of a text file
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.
Related videos on Youtube
dnkb
Updated on September 17, 2022Comments
-
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 almost 14 yearsFrom the
sed
info file: "Note: the POSIX standard does not specify what should happen when you mix theg' 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 almost 14 yearsInfo files... I hate them. Anyway, I removed the ambiguous part. Good comment, +1.
-
dnkb almost 14 yearsThanks, mrucci and Dennis. I thought that there must be something simple out there.
-
AlexCheuk about 12 yearsIt seems every problem I have with text manipulation, I manage to solve with
sed
. I'm not sure I should be thanking you for makingsed
even more useful to me, but I will anyway. ;)