(如何)使用sed删除所有换行符(\n)?

(如何)使用sed删除所有换行符(\n)?,sed,newline,Sed,Newline,我尝试删除管道中的所有换行符,如下所示: (echo foo; echo bar) | sed -e :a -e N -e '$!ba' -e 's/\n/ /g' | hexdump -C 这导致debian挤入: 00000000 66 6f 6f 20 62 61 72 0a |foo bar.| 00000008 不删除尾部换行符 tr-d'\n'as in works很好,但不是sed。很抱歉,无法使用sed完成,请参阅: 这里

我尝试删除管道中的所有换行符,如下所示:

(echo foo; echo bar) | sed -e :a -e N -e '$!ba' -e 's/\n/ /g' | hexdump -C
这导致debian挤入:

00000000  66 6f 6f 20 62 61 72 0a                           |foo bar.|
00000008
不删除尾部换行符


tr-d'\n'
as in works很好,但不是sed。

很抱歉,无法使用sed完成,请参阅: 这里有一个讨论:


如果作为最后一个字符出现,sed将添加回\n。

如果要删除最后一个
\n
则需要外部实用程序,或使用例如
awk

printf "%s" `(echo foo; echo bar) | sed -e :a -e N -e '$!ba' -e 's/\n/ /g'`
应该有效。

比较:
{ echo foo; echo bar; } | awk '{printf("%s ", $0)}' 
(echo foo;echo bar)| sed-e:a-e N-e'$!ba'-e's/\n//g'| hextump-C 具有 (echo foo;echo bar)| tr-d'\n'| hextump-C 然后是
埃科富;回声条)| hextump-C | sed-e:a-e N-e'$!ba'-e's/\n//g'

如果
foo
bar
不包含新行,则必须注意

(echo-foo;echo-bar)

将在每个
echo

(echo-n foo;echo-n bar)

不会在输出的末尾添加新行。 因此,您可能根本不需要sed删除新行,即使它删除了尾随行。

您也可以尝试:

(echo foo; echo bar) | sed 's/\n//' | xargs echo -n

您需要用其他内容替换\n,而不是删除它。由于行是由\n分隔的(至少在GNU/Linux上是如此),您需要告诉sed使用-z查找其他EOL字符,如下所示:

> echo -e "remove\nnew\nline\ncharacter" | sed -z "s/\n//g"
removenewlinecharacter> 
> echo -e "remove\nnew\nline\ncharacter" | sed "/rem\|char/d"
new
line
> echo -e "remove\nnew\nline\ncharacter" | sed -r "/rem|char/d"
new
line
>
sed通常会删除整条线(使用/d),如下所示:

> echo -e "remove\nnew\nline\ncharacter" | sed -z "s/\n//g"
removenewlinecharacter> 
> echo -e "remove\nnew\nline\ncharacter" | sed "/rem\|char/d"
new
line
> echo -e "remove\nnew\nline\ncharacter" | sed -r "/rem|char/d"
new
line
>
使用/d将删除包含下线的每一行,即所有行。(一)


HTH

不,OP自己介绍了一种使用
tr
的方法,并解释说,这不是
sed
-解决方案。很明显,他对
awk
-回复不感兴趣。@zsolt问题之间的区别在于,对于另一个问题,可以接受离开尾随的换行符。感谢并抱歉在提问之前没有阅读常见问题解答。这很好地解决了我的问题。也许我真的应该问:“我可以只使用sed删除所有换行符(\n),在管道中调用一次吗?-如果可以,如何删除?”虽然在本例中,我更喜欢在arg周围使用双引号的变量。
(echo foo;echo bar)| xargs echo-n
输出完全相同,但sed在这里什么都不做。