如何使用sed在字符串中替换多个字符?

14

我想用sed来替换字符串中的一些字符。

我尝试了以下两种方法,但我想知道是否有更优雅的方式可以得到相同的结果,而不需要使用管道或-e选项:

sed 's#a#A#g' test.txt | sed 's#l#23#g' > test2.txt
sed -e 's#a#A#g' -e 's#l#23#g' test.txt > test2.txt
3个回答

25

你可以在单个参数中使用 ; 分隔命令,而不是多次使用 -e 选项。

sed 's/a/A/g; s/1/23/g' test.txt > test2.txt

如果您正在寻找一种在单个命令中执行多个替换的方法,我认为这是不可能的。如果它们都是单个字符替换,您可以使用像y/abc/123这样的命令,它将把a替换为1b替换为2,并将c替换为3。但是没有这样的多字符版本。


感谢您的支持,Barmar。这是获得相同结果的最佳方式。 - neo33

6
除了Barmar的答案之外,您可能希望使用正则表达式字符类来执行多个字符到一个特定字符的替换。
以下是一个示例以澄清事情,请尝试使用和不使用sed运行它以感受效果
echo -e 'abc\ndef\nghi\nklm' | sed 's/[adgk]/1/g; s/[behl]/2/g; s/[cfim]/3/g'
附:永远不要从安全沙箱之外的陌生人运行示例代码。

2
对于你的附言,我想补充一点:永远不要在不理解代码的情况下运行示例代码 :D - Cyryl1972

2

当您需要大量字符串进行替换时,可以将它们收集到一个变量中。

seds="s/a/A/;"
seds+="s/1/23/;"
echo "That was 1 big party" |
   sed ${seds}

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