如何在BSD sed中使用换行?

Bre*_*yan 19 regex bsd sed

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

sed 's/ /\n/g'
Run Code Online (Sandbox Code Playgroud)

它从man-page声明\n将在替换字符串中字面处理,我该如何避免这种行为?有备用吗?

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

Woo*_*ble 17

在shell中,您可以:

    sed 's/ /\
/g'
Run Code Online (Sandbox Code Playgroud)

在反斜杠后按Enter键以插入换行符.

  • 太棒了,谢谢 Wooble。BSD sed 不支持替换字符串中的 \n 是否有任何已知原因?只是好奇。 (2认同)

sik*_*mir 8

其他方式:

sed -e 's/ /\'$'\n/g'
Run Code Online (Sandbox Code Playgroud)

看到这里.

  • +1,但请注意,这取决于shell功能,[ANSI C引用](http://www.gnu.org/software/bash/manual/bash.html#ANSI_002dC-Quoting)(`$'... ''),有些shell不支持它(例如,`dash` - 它不是POSIX的一部分).此外,`'s// \'$'\n''/ g'` - 在两个单引号字符串之间楔入`$'\n'` - 在概念上更清晰,更健壮.或者,使用`$'s// \\\n/g'`(注意需要转义`\`). (2认同)

Ner*_*elu 5

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

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

sed "s/ /\\${cr}/g"
Run Code Online (Sandbox Code Playgroud)

所以它保持在1行.

  • 有趣; 我可以建议调用变量`nl`而不是`cr`?假设您使用支持[ANSI C引用]的shell(http://www.gnu.org/software/bash/manual/bash.html#ANSI_002dC-Quoting)(例如,`bash`,`ksh`,`zsh `),你可以将赋值简化为`cr = $'\n'`; 那么你不必担心平台差异. (2认同)