Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Multiple replacements with one sed command

Tags:

shell

macos

sed

bsd

I'm wondering how I can do a multiple find/replace using a single sed statment in Mac OSX. I'm able to do this in Ubuntu but because of the BSD nature of OSX, the command must be slightly altered.

So, given a file with the string:

"Red Blue Red Blue Black Blue Red Blue Red" 

I want to run a sed statement that results in the output:

"Green Yellow Green Yellow Black Yellow Green Yellow Green" 

My two sed statements with a qualifying find

color1="Green"   color2="Yellow"   find . -type f -exec sed -i '' s/Red/$color1/g {} \;   find . -type f -exec sed -i '' s/Blue/$color2/g {} \;   

I've tried several combinations of semicolons and slashes, and looked at Apple's Dev man page for sed but with a lack of examples, I couldn't piece it together.

like image 675
user1026361 Avatar asked Oct 25 '13 13:10

user1026361


People also ask

Does sed support multiline replacement?

By using N and D commands, sed can apply regular expressions on multiple lines (that is, multiple lines are stored in the pattern space, and the regular expression works on it): $ cat two-cities-dup2.

How do you put multiple patterns in sed?

Use multiple patterns at once with SedLook out for the semicolon(;) to add more patterns within the single command.

Which option is used to combine multiple sed commands?

In this article let us review how to combine multiple sed commands using option -e as shown below. Note: -e option is optional for sed with single command. sed will execute the each set of command while processing input from the pattern buffer.


2 Answers

Apple's man page says Multiple commands may be specified by using the -e or -f options. So I'd say

find . -type f -exec sed -i '' -e s/Red/$color1/g -e s/Blue/$color2/g {} \; 

This certainly works in Linux and other Unices.

like image 64
Lars Brinkhoff Avatar answered Oct 10 '22 15:10

Lars Brinkhoff


It should be also possible to combine sed commands using semicolon ;:

find . -type f -exec sed -i '' -e "s/Red/$color1/g; s/Blue/$color2/g" {} \; 

I was wondering how portable this is and found through this Stackoverflow answer a link to the POSIX specification of sed. Especially if you have a lot of sed commands to run, this seems less cluttered to me than writing multiple sed expressions.

like image 30
FooF Avatar answered Oct 10 '22 14:10

FooF