shell 使用一个sed命令进行多次替换

ohtdti5x  于 2023-01-13  发布在  Shell
关注(0)|答案(3)|浏览(259)

我想知道如何在Mac OSX中使用单个sed语句执行多个查找/替换。我可以在Ubuntu中执行此操作,但由于OSXBSD特性,命令必须稍微更改。
因此,给定一个包含以下字符串的文件:

"Red Blue Red Blue Black Blue Red Blue Red"

我想运行一个sed语句,其结果如下:

"Green Yellow Green Yellow Black Yellow Green Yellow Green"

我的两个sed语句使用限定的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 {} \;

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

6psbrbz9

6psbrbz91#

Apple的手册页上说 * 可以使用-e或-f选项指定多个命令。

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

这当然适用于Linux和其他Unice。

vnzz0bqm

vnzz0bqm2#

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

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

与编写多个sed表达式相比,这减少了混乱。
我想知道这有多便携,并通过this Stackoverflow answer找到了一个到the POSIX specification of sed的链接。

jm81lzqq

jm81lzqq3#

在我最近的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的忠实粉丝,这绝对不是一个理想或优雅的解决方案,但它确实奏效了。

相关问题