21

问候,我如何在 BSD sed 中执行以下操作?

sed 's/ /\n/g'

从手册页中它指出 \n 将在替换字符串中按字面意思对待,我该如何避免这种行为?有替代品吗?

我正在使用 Mac OS Snow Leopard,我可能会安装 fink 来获取 GNU sed。

4

4 回答 4

22

在外壳中,您可以执行以下操作:

    sed 's/ /\
/g'

在反斜杠后按回车键以插入换行符。

于 2009-09-14T13:18:25.473 回答
10

其他方式:

sed -e 's/ /\'$'\n/g'

这里

于 2013-11-09T22:09:57.903 回答
7

为了方便使用,我个人经常使用

cr="\n" 
# or (depending version and OS)
cr="
"

sed "s/ /\\${cr}/g"

所以它保持在 1 行。

于 2013-11-11T06:58:09.637 回答
0

要扩展@sikmir 的答案:在 Bash(Mac OS X 上的默认 shell)中,您需要做的就是$在包含要解释的转义序列的引号字符串前面放置一个字符。Bash 会自动为你翻译。

例如,我从所有源文件中删除了所有 MS-DOS 回车符,lib/include/通过以下方式编写:

grep -lr $'\r' lib include | xargs sed -i -e $'s/\r//'
find . -name '*-e' -delete

BSDgrep本身可以正确解释'\r',但使用$'\r'并没有什么坏处。

BSDsed本身会误解's/\r//',但是通过使用$'s/\r//',我避免了这个陷阱。

请注意,我们可以将$整个字符串放在前面,它会处理整个字符串中的所有转义序列。

$ echo $'hello\b\\world'
hell\world
于 2018-04-05T21:41:18.287 回答