40

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.

Kara
  • 6,115
  • 16
  • 50
  • 57
user1026361
  • 3,627
  • 3
  • 22
  • 20
  • Possible duplicate of [combining 2 sed commands](http://stackoverflow.com/questions/7657647/combining-2-sed-commands) – tripleee Dec 17 '15 at 12:31

3 Answers3

36

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.

Lars Brinkhoff
  • 13,542
  • 2
  • 28
  • 48
27

It is possible to combine sed commands using semicolon ;:

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

This reduces clutter compared to writing multiple sed expressions.

I was wondering how portable this is and found through this Stackoverflow answer a link to the POSIX specification of sed.

FooF
  • 4,323
  • 2
  • 31
  • 47
1

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.

entpnerd
  • 10,049
  • 8
  • 47
  • 68
  • At least with macOS 12.5.1 it works as expected, e.g.: `echo abcdef | sed -e 's/a/A/g' -e 's/e/E/g'` returns `AbcdEf`. – clemens Sep 13 '22 at 10:24