在sed替换字符串中如何转义换行符

28

这是我尝试使用 sed 在运行 bash 时将一个 b 字符替换为换行符的方法。

$> echo 'abc' | sed 's/b/\n/'
anc

不,那不是它。

$> echo 'abc' | sed 's/b/\\n/'
a\nc

不,那也不是我想要的输出。

a
c

求助!


1
这对我来说在Ubuntu 11.10上使用GNU sed的方式是你想要的。你使用的sed版本是什么? - Dan Fego
在我的Debian(Wheezy)上,echo 'abc' | sed 's/b/\n/' 命令在我的bash中可以正常运行。我的bash版本是:GNU bash, version 4.1.5(1)-release (x86_64-pc-linux-gnu)。我的sed版本是:GNU sed version 4.2.1。 - Susam Pal
不确定,手册上没有说明,并且“sed -V”无法工作,但我在SunOS 5.10上。 - spraff
2
在Solaris上,您可以通过设置以下路径来获取与POSIX兼容的'sed':PATH=/usr/xpg6/bin:/usr/xpg4/bin:/usr/css/bin:$PATH - Susam Pal
5个回答

18

看起来你在使用BSD或Solaris操作系统。尝试以下方法:

[jaypal:~/Temp] echo 'abc' | sed 's/b/\ 
> /'
a
c

在输入反斜杠并按回车后,完成你的sed语句。


1
当我意识到他在使用Solaris系统时,我尝试手动输入命令,但是忘记在行末加上反斜杠。好的发现。 - Dan Fego
@spraff Solaris的sed非常过时,需要显式换行符\n - jaypal singh
7
如果你有bash,甚至在Solaris上也可以像这样写并使其工作:echo abc | sed 's/b/\'$'\n'/ - 这里的优势是你不必担心复制和粘贴时出现困扰的换行符。 $'\n' 是插入转义序列的一种基于bash的方法。对于sed来说,看到这个符号时它与Jaypal版本中的是相同的。 - sorpigal
1
此外:在这种情况下,反斜杠不是由bash解释的,而是由sed解释的。sed要求在替换模式中转义换行符。考虑这个例子:(set -x; echo abc | sed "s/b/\$PATH/"),它显示了bash已经解释了\$,而sed只看到了$,与此相比:(set -x; echo abc | sed 's/b/\'$'\n'/),它显示了bash已经扩展了$'\n',但是将其前面的反斜杠留给了sed。为了进行比较,请尝试运行echo abc | sed "s/b/\"$'\n'/并查看结果。 - sorpigal
@sorpigal - 请将您获得赞同的评论单独发布为答案,因为它比其他大多数答案都更好。 - user667489
显示剩余9条评论

7
$ echo 'abc' | sed 's/b/\'$'\n''/'
a
c

在Bash中,$'\n'会扩展为一个单引号的换行符(见man bash中的“QUOTING”部分)。这三个字符串在传入sed作为参数之前被连接起来。Sed要求转义换行符,因此我粘贴的代码中有第一个反斜杠。

2
很好的答案!我认为echo 'abc' | sed $'s,b,\\\n,'更加清晰易懂。 - davidchambers

5

你没有说明你想要全局替换所有的b。如果是的话,你需要用tr

$ echo abcbd | tr b $'\n'
a
c
d

在 Solaris 5.8 和 bash 2.03 上对我有效。


1

在一个多行文件中,我必须通过sed的两侧使用tr命令,如下所示:

echo "$FILE_CONTENTS" | \ tr '\n' ¥ | tr ' ' ∑ | mySedFunction $1 | tr ¥ '\n' | tr ∑ ' '

Unix喜欢剥离换行符、额外的前导空格和各种东西,因为我猜当它在20世纪制作时,这似乎是正确的事情。无论如何,上面展示的方法可以完美解决这个问题。但愿我能在某个地方看到有人发布这个方法,因为这会节省我大约三个小时的时间。


-1
echo 'abc' | sed 's/b/\'\n'/' 

你缺少''来包含\n


刚在Ubuntu 11.01上测试过,可以正常运行。我的Bash版本是GNU Bash,版本号为4.2.10(1)-release (i686-pc-linux-gnu),Sed版本为4.2.1。 - Ravi Bhatt
在我的bash 4.3.42(1)版本上可以工作。 - Hitechcomputergeek
这只是以另一种方式书写问题中的第一个命令,它在类似BSD和Solaris版本的sed上会以完全相同的方式失败。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接