快速回答
sed ':a;N;$!ba;s/\n/ /g' file
-
:a 创建一个标签'a'
-
N 将下一行添加到模式空间
-
$! 如果不是最后一行,ba 分支(转到)标签'a'
-
s 替换,/\n/ 正则表达式换行,/ / 按空格,/g 全局匹配(尽可能多次)
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 $( 等其他替代方法速度较慢,仅适用于小文件,需要处理整个文件才能开始处理。
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/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'命令将Next line添加到模式空间;
(2) 至少两次使用'H'命令来追加当前行
到保持空间,然后从保持空间中检索行
与 x、g 或 G;或 (3) 使用地址范围(参见上文第 3.3 节)
匹配两个指定地址之间的行。
选择 (1) 和 (2) 会将 \n 放入模式空间中,它
可以根据需要寻址('s/ABC\nXYZ/alphabet/g')。一个例子
使用 'N' 删除一行行的方法出现在 4.13 节
(“如何删除特定连续行的块?”)。这
可以通过将删除命令更改为某事来修改示例
其他,如 '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。