可移植地在sed中用换行符替换\ n


23

我对GNU sed,POSIX sed和BSD sed的众多选择感到困惑。如何\n使用这三种sed类型用换行符替换文字?


他们有很多不同的东西,您想知道哪一部分?
cuonglm 2014年

@Gnouc我想现在很清楚。
Avinash Raj 2014年


2
您想在诸如foo\\nbar或输入上发生foo\\\nbar什么?
吉尔斯(Gillles)“所以-不要再邪恶了”

简单,在下一行中的foo \\将是bar。
Avinash Raj

Answers:


30
sed 's/\\n/\
/g'

在替换字符串中按回车键之前,请注意反斜杠。


这对所有类型的sed都有效吗?
Avinash Raj 2014年

我相信应该;我仅在使用gnu版本的Linux上进行过测试。
unxnut14年

11
@AvinashRaj。那是POSIX,并且sed在1979年的Unix v7中与原始命令一起使用。唯一不起作用的地方是非POSIX简化的实现,sed例如某些基于busybox的简化实现。那在csh中不起作用,但这是一个csh问题。
斯特凡Chazelas

由于\\n用于搜索部分,为什么不用于\n替换?前者似乎暗示着后者的存在。即。为什么不这样呢$ echo '1\n2'|sed 's/\\n/\n/g'

在这种情况下,\n是一个文字,表示它显示为两个字符:反斜杠后跟n,而不是单个换行符。因此,两个反斜杠用于使反斜杠成为文字,然后n
unxnut

9

既然您已经有了可移植的sed答案,那么我只想提一下,sed如果您需要以某种方式操纵换行符,它就不是最好的工具。Perl与几乎一样具有可移植性sed,默认情况下,Perl已安装在大多数* nix系统上,并且可以很轻松地处理此问题:

printf '%s\n' 'aa\nbb' | perl -pe 's/\\n/\n/g'

另一个非常便携的选择是awk

printf '%s\n' 'aa\nbb' | awk  '{gsub("\\\\n","\n")};1'

在Solaris上,请记住使用/ usr / xpg4 / bin中的标准awk,/ bin中的标准awk是历史版本,不应用于新脚本。


我说awk也有类似的可移植性问题(我是awk普通的旧awknawkgawk?)。实际上,我的Solaris框中的版本缺少gsub()。我的投票是Perl的(perl -nlawe '...'近似于的自动行为awk)。
arielCo 2014年

2
@arielCo:为了awk便于携带,请坚持使用与awkPOSIX兼容的版本,并且仅使用这些功能,就可以了。在Solaris上,您会找到一个/usr/xpg4/bin/awk
审查者


@arielCo实际上,awk 比perl 更可移植。我不使用的第二种awk方法gsub()应该在几乎所有地方都有效。甚至busybox都有一个awk
terdon

1
gsub()是POSIX(gsub,是在SVR3.1中添加的,POSIX awk是基于SVR4的,还有一些附加信息,请参见gawk手册以获取更多信息),gensub()是GNU扩展。原始awk在Solaris上仍为/ bin / awk,不支持gsub(),但也不支持多字符FS。
斯特凡Chazelas

1

如果Holdspace为空,您还可以执行以下操作:

sed '/\\n/G;s/\\n\(.*\)\(.\)/\2\1/;P;D'

...但是uxnut的答案已经更快,更简单,因此您可以随心所欲

另一个无关的可能性:

INPUT | sed -n l | while read v ; do printf "${v%?}" ; done

但是请注意,^转换了所有标准的C样式\反斜杠转义\b符-例如ackspace和\return和\00octal以及您所拥有的。



-2

您需要sed中的解决方案,下面已经给出了。但是我想增加另一种可能性,即恕我直言变得越来越容易,

tr -d "\n"

1
这是做什么的?从输入中删除所有换行符?
mikeserv

是的,这正是它的作用
jpmuc 2014年

5
但为什么?这与这个问题有什么关系?
mikeserv

1
当问题询问如何用实际换行符替换字符串“ \ n”时,这只会删除“ \ n”。
spuder
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.