如何使用sed替换换行符(\ n)?
如何使用sed命令替换换行符( n
)?
我尝试失败:
sed 's#n# #g' file
sed 's#^$# #g' file
我如何解决它?
在GNU sed
使用此解决方案:
sed ':a;N;$!ba;s/n/ /g' file
这将在循环中读取整个文件,然后用空格替换换行符。
说明:
:a
创建标签:a
。 N
追加当前行和下一行到模式空间。 $!ba
( $!
意味着不要在最后一行执行它,因为应该有最后一行)。 以下是跨平台兼容的语法,可与BSD和OS X的sed
(根据@Benjie评论):
sed -e ':a' -e 'N' -e '$!ba' -e 's/n/ /g' file
用tr
代替?
tr 'n' ' ' < input_filename
或者完全删除换行符:
tr -d 'n' < input.txt > output.txt
或者如果你有GNU版本(有很长的选项)
tr --delete 'n' < input.txt > output.txt
快速回答:
sed ':a;N;$!ba;s/n/ /g' file
sed将循环执行第1步到第3步,直到它到达最后一行,将所有行放入模式空间,其中sed将替换所有 n个字符
替代品 :
与sed不同的是,所有替代方案都不需要达到开始该过程的最后一行
与bash ,慢
while read line; do printf "%s" "$line "; done < file
perl ,sed般的速度
perl -p -e 's/n/ /' file
与tr ,比sed更快,只能由一个字符替换
tr 'n' ' ' < file
与贴 ,tr样速度,只能由一个字符替换
paste -s -d ' ' file
以awk ,tr-like的速度
awk 1 ORS=' ' file
其他类似于“echo $(<file)”的选项很慢,仅适用于小文件,需要处理整个文件以开始进程。
来自sed的长答案 FAQ 5.10:
5.10。 为什么我无法使用 n转义匹配或删除换行符
序列? 为什么我不能使用 n匹配2行或更多行?
n将永远不会匹配行尾的换行符,因为
换行之前始终剥离换行符
模式空间。 要将2行或更多行写入模式空间,请使用
'N'命令或类似的东西(比如'H; ...; g;')。
Sed的工作原理是这样的:sed一次只读一行,剔除掉
终止换行符,将剩下的内容放入模式空间中
sed脚本可以解决或改变它,并且当模式空间
被打印,追加一个换行符到标准输出(或一个文件)。 如果
模式空间完全或部分用'd'或'D'删除,
在这种情况下不会添加换行符。 因此,脚本就像
sed 's/n//' file # to delete newlines from each line
sed 's/n/foon/' file # to add a word to the end of each line
将永远不会工作,因为后面的换行符被删除了
该行被放入模式空间。 为了执行上述任务,
改用这些脚本之一:
tr -d 'n' < file # use tr to delete newlines
sed ':a;N;$!ba;s/n//g' file # GNU sed to delete newlines
sed 's/$/ foo/' file # add "foo" to end of each line
由于GNU sed以外的sed版本对大小有限制
模式缓冲区,Unix'tr'工具在这里是首选。
如果文件的最后一行包含换行符,那么GNU sed将会添加
该输出的新行,但删除所有其他,而tr会
删除所有换行符。
要匹配两行或更多行的块,有三个基本选项:
(1)使用'N'命令将下一行添加到模式空间;
(2)使用'H'命令至少两次追加当前行
到保留空间,然后从保存空间中检索行
与x,g或G; 或(3)使用地址范围(参见上面的3.3节)
匹配两个指定地址之间的行。
选择(1)和(2)会将 n放入模式空间中
可以根据需要进行处理('s / ABC nXYZ / alphabet / g')。 一个例子
使用'N'删除一行代码块出现在4.13节
(“如何删除一段特定的连续行?”)。 这个
可以通过将delete命令更改为某些内容来修改示例
其他,如'p'(print),'i'(插入),'c'(更改),'a'(追加),
或's'(替代)。
选项(3)不会将 n放入模式空间,但它确实如此
匹配一连串的连续线,所以它可能是你没有
甚至需要 n找到你要找的东西。 自从GNU sed
版本3.02.80现在支持这种语法:
sed '/start/,+4d' # to delete "start" plus the next 4 lines,
除了传统的'/ from here /,/ to there / {...}'范围之外
地址,可能完全避免使用 n。