【发布时间】:2019-02-08 01:09:18
【问题描述】:
如何使用 sed 在),( 的逗号后插入换行符?
$ more temp.txt
(foo),(bar)
(foobar),(foofoobar)
$ sed 's/),(/),\n(/g' temp.txt
(foo),n(bar)
(foobar),n(foofoobar)
为什么这不起作用?
【问题讨论】:
-
您使用的是什么平台和版本的 sed?
如何使用 sed 在),( 的逗号后插入换行符?
$ more temp.txt
(foo),(bar)
(foobar),(foofoobar)
$ sed 's/),(/),\n(/g' temp.txt
(foo),n(bar)
(foobar),n(foofoobar)
为什么这不起作用?
【问题讨论】:
sed 在其替换命令中不支持\n 转义序列,但是,如果您对其进行转义,它确实支持真正的换行符(因为sed 命令只能使用单行,而转义是在这里告诉sed你真的想要一个换行符):
$ sed 's/),(/),\\
(/g' temp.txt
(foo),
(bar)
(foobar),
(foofoobar)
您还可以使用 shell 变量来存储换行符。
$ NL='
'
$ sed "s/),(/,\\$NL(/g" temp.txt
(foo),
(bar)
(foobar),
(foofoobar)
在 Mac OS X Lion 上测试,使用 bash 作为外壳。
【讨论】:
\` but not `?
sed 的命令不应包含换行符。因此,如果您想传递换行符,则需要使用反斜杠对其进行转义,以便 sed 知道您是故意这样做的。而且你需要第二个反斜杠来保护第一个反斜杠不被shell解释(使用反斜杠来转义正则表达式中的字符是恕我直言的一个坏主意,因为它通常也用于引用字符串中的字符,因此你通常必须使用双反斜杠在正则表达式中)。
好的,我知道这个问题已经过时了,但我只需要通过这个来让 sed 接受一个 \n 字符。我找到了一个适用于 bash 的解决方案,我在这里为遇到相同问题的其他人指出了它。
重申问题:让 sed 接受反斜杠转义换行符(或其他反斜杠转义字符)。
bash 中的解决方法是使用:
$'\n'
在 bash 中,$'\n' 字符串被替换为真正的换行符。
您唯一需要做的另一件事是双重转义 \n,因为您必须转义斜线本身。
把它们放在一起:
sed $'s/),(/),\\\n(/g' temp.txt
(foo),
(bar)
(foobar),
(foofoobar)
如果您希望它实际更改而不是打印出来,请使用 -i
sed -i $'s/),(/),\\\n(/g' temp.txt
【讨论】:
您只需使用反斜杠字符转义并在键入时按回车键:
$ sed 's/),(/),\
(/g' temp.txt
(foo),
(bar)
(foobar),
(foofoobar)
【讨论】:
这对我有用:
$ echo "(foo),(bar)" | sed s/')','('/')',\\n'('/g
(foo),
(bar)
我正在使用:
【讨论】: