如何使用sed从字符串中删除两个给定字符之间的空格?

时间:2018-01-04 21:41:58

标签: regex sed

我想使用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

1 个答案:

答案 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