Mac OS X 上 sed 中的换行符

Mac OS X 上 sed 中的换行符

我发现这\n在 Mac OS X 下的 sed 中不起作用。具体来说,假设我想将由单个空格分隔的单词分成几行:

# input
foo bar

我用,

echo "foo bar" | sed 's/ /\n/'

但结果很愚蠢,没有\n逃脱!

foonbar

我咨询了谷歌后,找到了一个解决方法

echo 'foo bar' | sed -e 's/ /\'$'\n/g'

读完这篇文章后,我仍然不明白这是什么\'$'\n/g'意思。有人能给我解释一下吗,或者还有其他方法吗?谢谢!

答案1

您可以brew install gnu-sed用 替换对 的sed调用gsed


要使用它来sed代替gsed,brew 会在安装后打印以下说明:

GNU "sed" has been installed as "gsed".
If you need to use it as "sed", you can add a "gnubin" directory
to your PATH from your bashrc like:

    PATH="/usr/local/opt/gnu-sed/libexec/gnubin:$PATH"

也就是说,将以下行附加到您的 ~/.bashrc 或 ~/.zshrc:

export PATH="/usr/local/opt/gnu-sed/libexec/gnubin:$PATH"

答案2

这些也可以:

echo 'foo bar' | sed 's/ /\
/g'

echo 'foo bar' | sed $'s/ /\\\n/g'

lf=$'\n'; echo 'foo bar' | sed "s/ /\\$lf/g"

OS X 的 sed 不会解释\n替换模式,但您可以使用以行继续符开头的文字换行符。$'\n'在运行 sed 命令之前,shell 会使用文字换行符进行替换。

答案3

您找到的解决方法是将单个参数字符串传递给sed -e

该参数最终成为熟悉的 seds/ / /g格式的字符串。

该字符串分为两部分,一个接一个地创建。

第一部分以形式引用'...'

第二部分,以形式引用$'...'

's/ /\'部分删除了单引号,但其他部分则按照命令行显示的方式传递给 sed。也就是说,反斜杠不会被 bash 吃掉,而是传递给 sed。

$'\n/g'部分去掉了美元符号和单引号,并\n转换为换行符。

总之,论点变成了

s/ /\ newline/g

[这很有趣。花了一段时间才解开。+1,这是一个有趣的问题。]

答案4

很容易直观地看到发生了什么。只需回显字符串即可!

echo 's/$/\'$'\n/g'

结果是

s/$/\
/g

相当于s/$/\newline/g

\如果在 之前没有多余的字符newline,那么 shell 会newline过早地将 解释为命令的结束。

相关内容