用于组合由空行分隔的N个文本行的Sed?

时间:2016-09-27 20:52:55

标签: sed

我搜索了一下,但没有找到针对这种特定情况的解决方案。给定一个管道输出任意数量的非空行分隔单个空行的组,是否有一个sed单行(或awk单行或perl单行)将非空行组合成单行,同时保留空白行?例如,输入

one
two

three
four
five

six

seven
eight

应输出为

one two

three four five

six

seven eight

提前感谢所有回复的人。

4 个答案:

答案 0 :(得分:4)

这可能适合你(GNU sed):

validate()

如果该行不为空,请阅读以下行,如果该行不为空,则用空格替换换行并重复,否则打印图案空间。如果第一行中的行是空的,则打印空行:这适用于空的第一行,如果不是这样的话,那么非空行之间只有一个空行:

sed '/./{:a;N;s/\n\(.\)/ \1/;ta}' file

就足够了。

答案 1 :(得分:3)

Perl one-liner

perl -00 -lpe 'tr/\n/ /'

,其中

  • -00以空白行分隔的段落
  • 读取输入
  • -l会自动处理行尾换行符
  • -p会在处理后自动打印每条记录
  • tr/\n/ /'将所有换行更改为空格

答案 2 :(得分:3)

修改样本输入以包含多个连续的空行

$ cat ip.txt 
one
two


three
four
five

six

seven
eight

awk解决方案:

$ awk -v RS= -v ORS="\n\n" '{gsub("\n"," "); print}' ip.txt 
one two

three four five

six

seven eight

还要保留多个空格:

$ perl -0777 -pe 's/[^\n]\K\n(?=^[^\n])/ /mgs' ip.txt 
one two


three four five

six

seven eight
  • -0777将整个文件作为一个字符串,因此如果输入文件大到不适合内存,则不适合
  • 正则表达式匹配非换行符后跟换行符和下一行不是空白行。 lookbehind和lookahead用于轻松替换和避免递归搜索

答案 3 :(得分:3)

awk解决方案:如果您不希望输出中有空白行,则将RS设置为空白行并将ORS设置为两个新行,只需从下方命令进行远程ORS。

awk -v RS= -v ORS="\n\n" '{$1=$1}1' foo.in
one two

three four five

six

seven eight