快速回答
sed ':a;N;$!ba;s/\n/ /g' file
- :a 创建标签'a'
- N 将下一行追加到模式空间
- $! 如果不是最后一行,则ba 分支(转到)标签“ a”
- 小号 替代,/ \ N / 新线的正则表达式,/ / 通过的空间,/克 全局匹配(多次它可以)
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般的速度
awk 1 ORS=' ' file
其他替代方法如“ echo $(<file)”速度很慢,仅适用于小文件,需要处理整个文件才能开始处理。
5.10。为什么我不能使用\ n转义
序列来匹配或删除换行符?为什么我不能使用\ n匹配两行或更多行?
\ n永远不会与行尾的换行符匹配,因为在将
换行符放入
模式空间之前,总是会删除换行符。要将2行或更多行插入模式空间,请使用
'N'命令或类似的命令(例如'H; ...; g;')。
sed的工作方式如下:sed一次读取一行,剪掉
终止的换行符,将剩下的内容放入
sed脚本可以寻址或更改的模式空间中,并且在
打印模式空间时,在stdout后面添加一个换行符(或到文件)。如果
用'd'或'D'完全或部分删除了模式空间,则在这种情况下不添加
换行符。因此,类似
sed 's/\n//' file # to delete newlines from each line
sed 's/\n/foo\n/' 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将删除所有换行符。
为了匹配两行或更多行的块,有3种基本选择:
(1)使用'N'命令将下一行添加到模式空间;
(2)至少使用两次“ H”命令将当前行追加
到Hold空间,然后
使用x,g或G 从hold空间中检索这些行;或(3)使用地址范围(请参见上文第3.3节)
来匹配两个指定地址之间的行。
选项(1)和(2)将\ n放入模式空间,
可以根据需要对其进行寻址('s / ABC \ nXYZ / alphabet / g')。
第4.13节
(“如何删除特定的连续行的块?”)显示了一个使用“ N”删除行的块的示例。
可以通过将delete命令更改为其他
内容来修改此示例,例如“ p”(打印),“ 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。
tr
如果将单个字符替换为单个字符,则仅是该工作的正确工具,而上例显示了用空格替换换行符。因此,在上例中,tr可以工作。