如何使用sed命令将换行符(“\n”)替换为空格(“”)?
我尝试过:
sed 's#\n# #g' file
sed 's#^$# #g' file
如何修复?
如何使用sed命令将换行符(“\n”)替换为空格(“”)?
我尝试过:
sed 's#\n# #g' file
sed 's#^$# #g' file
如何修复?
当前回答
三件事。
tr(或cat等)是绝对不需要的。(GNU)sed和(GNU)awk结合在一起,可以完成99.9%的文本处理。流!=基于行。ed是一个基于行的编辑器。sed不是。有关差异的更多信息,请参阅sed讲座。大多数人将sed误认为是基于行的,因为默认情况下,它对SIMPLE匹配的模式匹配并不十分贪婪-例如,当进行模式搜索并替换为一个或两个字符时,默认情况下它只替换找到的第一个匹配(除非全局命令另有规定)。如果它是基于行而不是基于STREAM的,甚至不会有全局命令,因为它一次只能计算行。尝试运行ed;你会注意到差异。如果您想要在特定行上迭代(例如在for循环中),ed非常有用,但大多数时候您只需要sed。尽管如此,sed-e“{:q;N;s/\N//g;t q}”文件在GNUsed版本4.2.1中运行良好。上述命令将用空格替换所有换行符。它很难看,输入起来有点麻烦,但它工作得很好。{}可以省略,因为它们只是出于理智的原因才被包括在内。
其他回答
GNUsed有一个选项-z,用于空分隔记录(行)。您可以拨打:
sed -z 's/\n/ /g'
是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~$
以前的大多数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命令将删除其中的所有空格。
试试看:
echo "a,b"|sed 's/,/\r\n/'
答案是:标签。。。
如何使用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是类似的。