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.
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.
Use multiple patterns at once with SedLook out for the semicolon(;) to add more patterns within the single command.
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.
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With