我想使用sed删除文本中字母“a”和“b”之间的所有空格。
waaa bbb => waaabbb
a b a b abb b => abababbb
z aaa bn i => z aaabn i
我知道如何使用正则表达式在文本中找到这些字符串:
grep -E '[ab]+[ ]+[ab]' file.txt
我也知道如何使用四个命令来完成它:
sed -E 's/a a/aa/' file.txt
sed -E 's/a b/ab/' file.txt
sed -E 's/b a/ba/' file.txt
sed -E 's/b b/bb/' file.txt
但是只使用一个sed命令可以做到这一点吗?
示例输入:
Lorem ipsum wa baaaaaaa baaa dolor sit amet, consectetur b b ba aaaa b adipiscing elit abba a g baa p a aaaa s
理想的输出:
Lorem ipsum wabaaaaaaabaaa dolor sit amet, consectetur bbbaaaaabadipiscing elit abbaa g baa p aaaaa s
答案 0 :(得分:2)
使用标签和条件测试:
sed ':a;s/\([ab]\) *\([ab]\)/\1\2/g;ta' file
或使用ERE:
sed -E ':a;s/([ab]) +([ab])/\1\2/g;ta' file
只要用上一个命令替换某些内容,测试t
就会跳转到标签a
。
有关sed功能的更多信息:grymoire
您也可以在没有测试的情况下完成,因为两次全局替换就足够了。您只需要重写替换命令:
sed 's/\([ab]\) *\([ab]\)/\1\2/g;s/\([ab]\) *\([ab]\)/\1\2/g' file
或使用ERE:
sed -E 's/([ab]) +([ab])/\1\2/g;s/([ab]) +([ab])/\1\2/g' file