使用SED在每个连续分隔符之间添加单个空格

时间:2015-08-13 18:48:05

标签: sed

这看起来很简单,但是我的脑子里却一团糟。

转换此

"value:::text:::::othervalue:::::::text"

到这个

"value: : :text: : : : :othervalue: : : : : : :text"

SED不是递归的,所以我明白了:

$ echo "value:::text:::::othervalue:::::::text" | sed 's/::/: :/g'
> value: ::text: :: ::othervalue: :: :: ::text

解决方法,sed两次

$ echo "value:::text:::::othervalue:::::::text" | sed 's/::/: :/g;s/::/: :/g'
> value: : :text: : : : :othervalue: : : : : : :text

这看起来并不优雅,而且不直观。是否有任何命令(在sed中?)可以更干净地执行此操作?

谢谢!

注意:我正在寻找可读性。

1 个答案:

答案 0 :(得分:3)

使用GNU sed:

echo '"value:::text:::::othervalue:::::::text"' | sed ':a;s/::/: :/g;ta'

输出:

"value: : :text: : : : :othervalue: : : : : : :text"

从sed手册页:

  

t label:如果一个s ///已经完成了一次成功的替换,因为读取了最后一个输入行,并且从最后一个t或T命令开始,然后分支到标签;如果省略label,则跳转到脚本结尾。

     

: label:b和t命令的标签。