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

我尝试过:

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

如何修复?


当前回答

在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

其他回答

将此解决方案与GNU sed一起使用:

sed ':a;N;$!ba;s/\n/ /g' file

这将在循环中读取整个文件(':a;N;$!ba),然后用空格(s/\N//g)替换换行符。如果需要,可以简单地附加其他替换。

说明:

sed首先将除换行外的第一行读取到模式空间中。通过:a创建标签。通过N将新行和下一行附加到图案空间。如果我们在最后一行之前,请分支到创建的标签$!ba($!表示不在最后一行执行此操作。这是避免再次执行N所必需的,如果没有更多输入,则会终止脚本!)。最后,替换用模式空间(即整个文件)上的空格替换每一个换行符。

以下是与BSD和OS X的sed兼容的跨平台语法(根据@Benjie评论):

sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ /g' file

正如您所看到的,使用sed解决这个简单的问题是有问题的。要获得更简单和充分的解决方案,请参阅以下答案。

这里是没有缓冲区的sed(适用于实时输出)。示例:在HTML中用<br/>break替换\n

echo -e "1\n2\n3" | sed 's/.*$/&<br\/>/'

是sed在“正常”替换之后引入了新的行。首先,它修剪新行字符,然后根据您的指示进行处理,然后引入新行。

使用sed,您可以为每个输入行用您选择的字符串替换修剪后的行(而不是新行字符)的“结尾”;但是,sed将输出不同的行。例如,假设您希望将“行尾”替换为“==”(比用单个空格替换更通用):

PROMPT~$ cat <<EOF |sed 's/$/===/g'
first line
second line
3rd line
EOF

first line===
second line===
3rd line===
PROMPT~$

要用字符串替换新行字符,可以低效地使用tr,如前所述,用“特殊字符”替换换行字符,然后使用sed用所需的字符串替换该特殊字符。

例如:

PROMPT~$ cat <<EOF | tr '\n' $'\x01'|sed -e 's/\x01/===/g'
first line
second line
3rd line
EOF

first line===second line===3rd line===PROMPT~$

使用允许查找和替换\n

sed -ie -z 's/Marker\n/# Marker Comment\nMarker\n/g' myfile.txt

标记

成为

#标记注释标记

较短的锥子替代品:

awk 1 ORS=' '

解释

awk程序由由条件代码块组成的规则组成,即:

condition { code-block }

如果省略了代码块,则使用默认值:{print$0}。因此,1被解释为真条件,并且每行执行打印$0。

当awk读取输入时,它会根据RS(记录分隔符)的值将其拆分为记录,默认情况下是一个换行符,因此awk默认情况下将按行解析输入。拆分还涉及从输入记录中剥离RS。

现在,当打印记录时,ORS(输出记录分隔符)被附加到记录上,默认值也是一个换行符。因此,通过将ORS更改为空格,所有换行符都将更改为空格。