【问题标题】:How do I use a new-line replacement in a BSD sed?如何在 BSD sed 中使用换行符?
【发布时间】:2010-11-28 03:12:26
【问题描述】:

您好,我如何在 BSD sed 中执行以下操作?

sed 's/ /\n/g'

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

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

【问题讨论】:

  • 小更正:\n 没有按字面意思处理,它被翻译成字面意思 n(即 `` 被删除;但这显然仍然不是预期的结果) .

标签: regex sed bsd


【解决方案1】:

在 shell 中,你可以这样做:

    sed 's/ /\
/g'

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

【讨论】:

  • 太棒了,谢谢 Wooble。 BSD sed 在替换字符串中不支持 \n 是否有任何已知原因?只是好奇。
  • 我不确定,但似乎他们只是决定在替换字符串中根本不支持转义。 sed 'y/ /\n/' 似乎有效,尽管它只进行字符串替换;如果您需要用正则表达式替换“”,它将失败。此外, \n 似乎是特殊情况; \r 给你一个'r',而不是回车。
【解决方案2】:

另一种方式:

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

here

【讨论】:

  • +1,但请注意,这依赖于 shell 功能 ANSI C quoting ($'...'),并且某些 shell 不支持它(例如,dash - 它不是 POSIX 的一部分) .此外,'s/ /\'$'\n''/g' - 在两个单引号字符串之间插入 $'\n' - 在概念上更清晰、更健壮。或者,使用$'s/ /\\\n/g'(注意需要转义\ )。
【解决方案3】:

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

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

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

所以它保持在 1 行。

【讨论】:

  • 有趣;我可以建议调用变量nl 而不是cr 吗?假设您使用支持ANSI C quoting 的shell(例如bashkshzsh),您可以简化对cr=$'\n' 的赋值;那么您就不必担心平台差异。
  • 很酷的建议,关于任何“unix”上的$'\n'?它确实会有所帮助(我的 Sun 给了我一些关于 \n 的分配/操作的问题)
  • $'\n'(ANSI-C 引用)如果您有正确的 shellbashkshzsh - 不在 POSIX 中 - 应该可以工作仅功能的外壳,例如dash),因此平台无关紧要。 (bash 在 2.0 版(很久以前)中引入了该功能 - 不确定 kshzsh,但我希望当前系统具有足够新的版本。
【解决方案4】:

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

例如,我从lib/include/中的所有源文件中删除了所有MS-DOS回车符:

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

BSD grep 会自行正确解释 '\r',但使用 $'\r' 并没有什么坏处。

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

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

$ echo $'hello\b\\world'
hell\world

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-04
    • 2014-08-08
    • 2013-06-26
    • 1970-01-01
    • 2013-02-27
    • 2014-01-25
    • 2015-02-15
    相关资源
    最近更新 更多