如何用 sed 模拟“替换 abb a”?

如何用 sed 模拟“替换 abb a”?

我试图用 sed 脚本模拟一个交换两个字符的替换命令,但明显的选择是:

sed -e 's/a/b/g' -e 's/b/a/g' 

没有任何作用。你能指出我如何正确地做到这一点吗?

答案1

我会使用翻译命令t例如。

tr ab ba < input_file

答案2

如果您只想更换个人人物,不是更长的字符串,使用

sed -e 'y/ab/ba/'

tr或X Tian 答案中的等效命令。对于任意字符串,你必须更加努力:

如果有任何字符肯定不会出现在输入中,例如#(即使是控制字符也可以),您可以使用类似

sed -e 's/a/#/g;s/b/a/g;s/#/b/g;'

或者,您可以通过添加前缀来实现一些技巧:

sed -e '
s/a/xa/g;
s/b/xb/g;
s/xa/yb/g;
s/xb/ya/g;
s/ya/a/g;
s/yb/b/g;
'

即:为 everyabwith加上前缀x(表示:尚未修改),替换xayb,反之亦然(y表示:已修改),并删除所有前缀。

答案3

如果你有空闲角色,可以听听乌韦的建议。

如果您确实只需要替换单个字符并且不一定需要sed,请tr按照 XTian 的建议使用。

如果你不需要sed并且你可能会替换更长的序列而不需要备用字符,你可能会使用类似的东西:

perl -le '%ex=(a=>"b",b=>"a"); $keys=join("|",keys(%ex)); $text="abba"; $text=~s/$keys/$ex{$&}/eg; print $text'

或者

ruby -e 'ex={"a"=>"b","b"=>"a"}; puts "abba".gsub(/(#{ex.keys.join("|")})/,ex)'

相关内容