我试图用 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;
'
即:为 everya
和b
with加上前缀x
(表示:尚未修改),替换xa
为yb
,反之亦然(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)'