我发现这\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
过早地将 解释为命令的结束。