如何使用sed命令将换行符(“\n”)替换为空格(“”)?
我尝试过:
sed 's#\n# #g' file
sed 's#^$# #g' file
如何修复?
如何使用sed命令将换行符(“\n”)替换为空格(“”)?
我尝试过:
sed 's#\n# #g' file
sed 's#^$# #g' file
如何修复?
当前回答
这真的很简单。。。当我找到解决办法时,我真的很生气。又少了一个反斜杠。这就是:
sed -i "s/\\\\\n//g" filename
其他回答
谁需要sed?以下是bash方式:
cat test.txt | while read line; do echo -n "$line "; done
我特别喜欢的解决方案是在保留空间中追加所有文件,并替换文件末尾的所有换行符:
$ (echo foo; echo bar) | sed -n 'H;${x;s/\n//g;p;}'
foobar
然而,有人告诉我,在一些sed实现中,保持空间可能是有限的。
防弹解决方案。二进制数据安全,符合POSIX,但速度较慢。
POSIX已使用需要根据POSIX文本文件和POSIX线定义,因此不允许NULL字节和过长的行,并且每行必须以换行符结尾(包括最后一行)。这使得使用sed处理任意输入数据变得困难。
下面的解决方案避免了sed,而是将输入的字节转换为八进制代码,然后再转换为字节,但拦截八进制代码012(换行)并输出替换字符串来代替它。据我所知,该解决方案符合POSIX,因此它应能在多种平台上工作。
od -A n -t o1 -v | tr ' \t' '\n\n' | grep . |
while read x; do [ "0$x" -eq 012 ] && printf '<br>\n' || printf "\\$x"; done
POSIX参考文件:sh中,shell命令语言,od中,tr中,grep,阅读[,输出函数
read、[和printf都至少在bash中内置,但POSIX可能无法保证这一点,因此在某些平台上,每个输入字节可能会启动一个或多个新进程,这会降低速度。即使在bash,这种解决方案也只能达到50kB/s左右,因此不适合大型文件。
在Ubuntu(bash、dash和busybox)、FreeBSD和OpenBSD上测试。
以前的大多数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命令将删除其中的所有空格。
也可以使用标准文本编辑器:
printf '%s\n' '%s/$/ /' '%j' 'w' | ed -s file
注意:这会将结果保存回文件。
与这里的大多数sed答案一样,此解决方案的缺点是必须首先将整个文件加载到内存中。