如何在逗号后用逗号插入换行符),(?
$ more temp.txt
(foo),(bar)
(foobar),(foofoobar)
$ sed 's/),(/),\n(/g' temp.txt
(foo),n(bar)
(foobar),n(foofoobar)
Run Code Online (Sandbox Code Playgroud)
为什么这不起作用?
sed\n在它的替换命令中不支持转义序列,但是,如果你将其转义,它确实支持一个真正的换行符(因为sed命令应该只使用一行,并且转义在这里告诉sed你真的想要一个换行符):
$ sed 's/),(/),\\
(/g' temp.txt
(foo),
(bar)
(foobar),
(foofoobar)
Run Code Online (Sandbox Code Playgroud)
您还可以使用shell变量来存储换行符.
$ NL='
'
$ sed "s/),(/,\\$NL(/g" temp.txt
(foo),
(bar)
(foobar),
(foofoobar)
Run Code Online (Sandbox Code Playgroud)
在Mac OS X Lion上测试,使用bashshell作为shell.
好的,我知道这个问题很老了,但我不得不费力地解决这个问题以使 sed 接受 \n 字符。我找到了一个在 bash 中有效的解决方案,我在这里为遇到同样问题的其他人指出它。
重述问题:让 sed 接受反斜杠转义换行符(或其他反斜杠转义字符)。
bash 中的解决方法是使用:
$'\n'
Run Code Online (Sandbox Code Playgroud)
在 bash 中,$'\n' 字符串被替换为真正的换行符。
您需要做的唯一另一件事是双重转义 \n,因为您必须转义斜杠本身。
把它们放在一起:
sed $'s/),(/),\\\n(/g' temp.txt
(foo),
(bar)
(foobar),
(foofoobar)
Run Code Online (Sandbox Code Playgroud)
如果您希望它实际更改而不是打印出来,请使用 -i
sed -i $'s/),(/),\\\n(/g' temp.txt
Run Code Online (Sandbox Code Playgroud)