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.
Question
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.
Solution
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.
OTHER TIPS
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.
With my recent version of Mac OS, I didn't have a lot of luck with multiple commands inside a single sed call. Instead, I just resorted to multiple pipes each with its own single sed command. I ended up using something like:
cat my-raw-input.txt | sed -r -E -e 's/myFirstRegex([^,]+).*/\1/' | sed -r -E 's/mySecondRegex([^,]+)/,\1/' > my-output.csv
As a big fan of sed, it's definitely not an ideal or elegant solution, but it worked.