一个sed命令中进行多个替换

40
我想知道如何在Mac OSX中使用单个sed语句进行多重查找/替换。我能在Ubuntu中做到这一点,但由于OSX的BSD本质,命令必须稍作修改。
因此,给定一个包含字符串的文件:
"Red Blue Red Blue Black Blue Red Blue Red"

我希望运行一个sed语句,以产生输出结果:
"Green Yellow Green Yellow Black Yellow Green Yellow Green"

我的两个带有限定符 find 的sed语句

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

我尝试了几种分号和斜杠的组合,并查看了Apple's Dev man page for sed,但由于缺乏示例,我无法将它们拼起来。

可能是合并2个sed命令的重复问题。 - tripleee
3个回答

37

苹果公司的手册中写道:可以使用 -e 或 -f 选项指定多个命令。因此,我认为

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

这当然适用于Linux和其他Unix系统。


27

使用分号;可以组合sed命令:

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

与编写多个sed表达式相比,这样可以减少混乱。

我在想这样做有多可移植性,并通过这个Stackoverflow答案找到了一个链接,指向POSIX规范中sed的说明


1

最近我使用的Mac OS版本,对于单个sed调用中的多个命令并不顺利。相反,我只能使用多个管道,每个管道都有自己的单个sed命令。最终我使用了以下类似的命令:

cat my-raw-input.txt | sed -r -E -e 's/myFirstRegex([^,]+).*/\1/' | sed -r -E 's/mySecondRegex([^,]+)/,\1/' > my-output.csv

作为一个非常喜欢sed的粉丝,它并不是最理想和优美的解决方案,但它确实有效。

至少在macOS 12.5.1中,它按预期工作,例如:echo abcdef | sed -e 's/a/A/g' -e 's/e/E/g' 返回 AbcdEf - clemens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接