如何在逗号后插入换行符,在`),(`用sed?

qaz*_*wsx 7 regex sed

如何在逗号后用逗号插入换行符),(

$ 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)

为什么这不起作用?

Syl*_*sne 7

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.


Dom*_*Dom 3

好的,我知道这个问题很老了,但我不得不费力地解决这个问题以使 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)