【发布时间】:2013-10-18 23:23:49
【问题描述】:
我有一个包含以下字符串的文件:
||||||
我想用|""| 替换每次出现的||,所以我使用了
sed 's/||/|\"\"|/g' temp2.csv
但我得到的输出是:
|""||""||""| 而不是|""|""|""|""|""|
我发现 sed 没有递归地进行替换,我怎样才能让 sed 递归地进行替换,以便只有在上一行没有出现 || 时才移动到下一行
感谢您的帮助。
【问题讨论】:
我有一个包含以下字符串的文件:
||||||
我想用|""| 替换每次出现的||,所以我使用了
sed 's/||/|\"\"|/g' temp2.csv
但我得到的输出是:
|""||""||""| 而不是|""|""|""|""|""|
我发现 sed 没有递归地进行替换,我怎样才能让 sed 递归地进行替换,以便只有在上一行没有出现 || 时才移动到下一行
感谢您的帮助。
【问题讨论】:
最直接的方法是调用 sed 替换两次。但我认为这个 sed 单线可能更好,因为如果你说它可以工作,我想递归地将 |||..{n}..| 替换为 |""|""|...{n}..|""|
sed ':a s/||/|""|/g; t a' file
使用您的数据进行测试:
kent$ cat f
||||||
kent$ sed ':a s/||/|""|/g; t a' f
|""|""|""|""|""|
【讨论】:
:a 和t a 的作用吗?它可以用于比s/// 更复杂的事情吗?
sed 不支持lookahead 或lookbehind,但在您的情况下,您可以进行第二遍:
<temp2.csv sed 's/||/|\"\"|/g' | sed 's/||/|\"\"|/g'
【讨论】:
使用awk 你可以这样做:
#echo '||||||' | awk '{gsub(/\|\|/,"|\"\"|")}1'
|""||""||""|
【讨论】: