如何使用sed命令将换行符(“\n”)替换为空格(“”)?

我尝试过:

sed 's#\n# #g' file
sed 's#^$# #g' file

如何修复?


当前回答

我不是专家,但我想在sed中,您首先需要将下一行追加到模式空间中,bij使用“N”。摘自《sed&awk》(Dale Dougherty and Arnold Robbins;O'Reilly 1997;预览版第107页)一书“高级sed命令”中的“多行模式空间”一节:

多行Next(N)命令通过读取新的输入行并将其附加到阵列空间的内容来创建多行阵列空间。模式空间的原始内容和新的输入行由换行分隔。嵌入的换行符可以通过转义序列“\n”进行模式匹配。在多行模式空间中,元字符“^”匹配模式空间的第一个字符,而不是任何嵌入换行符后面的字符。类似地,“$”只匹配模式空间中的最后一个换行符,而不匹配任何嵌入的换行符。执行Next命令后,控制权将传递给脚本中的后续命令。

发件人:

[2地址]N将下一行输入附加到模式空间,使用嵌入的换行符将附加的材料与原始内容分开。请注意,当前行号已更改。

我用它搜索了(多个)格式不正确的日志文件,其中搜索字符串可以在“孤立”的下一行找到。

其他回答

试试看:

echo "a,b"|sed 's/,/\r\n/'

在Mac OS X上(使用FreeBSD sed):

# replace each newline with a space
printf "a\nb\nc\nd\ne\nf" | sed -E -e :a -e '$!N; s/\n/ /g; ta'
printf "a\nb\nc\nd\ne\nf" | sed -E -e :a -e '$!N; s/\n/ /g' -e ta

在某些情况下,您可以将RS更改为其他字符串或字符。这样,\n可用于sub/gsub:

$ gawk 'BEGIN {RS="dn" } {gsub("\n"," ") ;print $0 }' file

shell脚本的强大之处在于,如果您不知道如何以一种方式执行,您可以用另一种方式来执行。很多时候,你要考虑的事情比简单问题的复杂解决方案要多。

关于呆呆的事情。。。并将文件读入内存,我不知道这一点,但对我来说,gawk似乎一次只能使用一行,而且速度非常快(没有其他一些快,但编写和测试的时间也很重要)。

我处理MB甚至GB的数据,我发现的唯一限制是行大小。

以前的大多数sed命令示例在我的Unix系统中都不适用,并给出错误消息:

Label too long: {:q;N;s/\n/ /g;t q}

这适用于所有Unix/Linux环境:

line=$(while read line; do echo -n "$line "; done < yoursourcefile.txt)
echo $line |sed 's/ //g' > sortedoutput.txt

第一行将从文件yoursourcefile.txt中删除所有新行,并生成一行。第二个sed命令将删除其中的所有空格。

答案是:标签。。。

如何使用sed替换换行符?

…在命令行的freebsd 7.2中不起作用:

( echo foo ; echo bar ) | sed ':a;N;$!ba;s/\n/ /g'
sed: 1: ":a;N;$!ba;s/\n/ /g": unused label 'a;N;$!ba;s/\n/ /g'
foo
bar

但如果您将sed脚本放在文件中或使用-e“构建”sed脚本。。。

> (echo foo; echo bar) | sed -e :a -e N -e '$!ba' -e 's/\n/ /g'
foo bar

> cat > x.sed << eof
:a
N
$!ba
s/\n/ /g
eof

> (echo foo; echo bar) | sed -f x.sed
foo bar

也许OS X中的sed是类似的。