30秒到达战场
快速回答:sed ':a;N;$!ba;s/\n/ /g' file: 创建标签'a'N 将下一行附加到模式空间$! 如果不是最后一行,ba 分支(转到)标签'a's 替换,/ \ n / 正则表达式为新行,// 由空格,/ g 全局匹配(尽可能多次)sed将遍历步骤1到3,直到到达最后一行,让所有行都适合模式空间,其中sed将替换所有\ n个字符替代方案:与sed不同,所有替代方案都不需要到达最后一行来开始该过程用bash,慢while read line; do printf "%s" "$line "; done
sed 's/\n/foo\n/' file # to add a word to the end of each line永远不会工作,因为在将行放入模式空间之前删除了尾随换行符。要执行上述任务,请改为使用以下脚本之一: tr -d '\n'
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行添加到模式空间; (2)使用'H'命令至少两次将当前行追加到Hold空间,然后用x,g或G 从保留空间中检索行; 或(3)使用地址范围(见上文第3.3节)来匹配两个指定地址之间的行。选择(1)和(2)将\ n放入模式空间,可以根据需要对其进行寻址('s / ABC \ nXYZ / alphabet / g')。使用“N”删除行块的一个示例显示在4.13节(“如何删除特定连续行的块?”)中。可以通过将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。