这看起来很简单,但是我的脑子里却一团糟。
转换此
"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中?)可以更干净地执行此操作?
谢谢!
注意:我正在寻找可读性。
答案 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命令的标签。