如何在段落中插入空行

时间:2015-03-10 07:34:33

标签: awk sed

在这个问题中,段落是由空行划分的文本块。 我希望在sed和/或awk中找到解决方案。我知道sed无法处理多线操作,但我想知道是否有任何技巧可以使用。

所以这些段落:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce fermentum, libero eget interdum varius, arcu magna sagittis massa, a viverra mi mauris nec nulla. 
Nam porttitor massa euismod arcu egestas, at dictum enim imperdiet. 


Duis vestibulum, sapien at posuere tempor, mauris turpis varius nisl, quis consectetur felis leo eu mi. 
Nullam at sapien dictum, tristique dui quis, bibendum ipsum. 
Fusce semper rutrum sollicitudin. Proin lacinia molestie neque non aliquam. Maecenas commodo sodales nunc auctor dignissim. 

Ut lectus libero, elementum eu interdum et, efficitur eu odio. 
Nulla scelerisque nibh ut tortor finibus porta. 
Pellentesque maximus nunc in aliquet malesuada. Etiam ac auctor ex.


Sed ac egestas urna, a sagittis lacus. 

最终看起来像这样:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce fermentum, libero eget interdum varius, arcu magna sagittis massa, a viverra mi mauris nec nulla.


Nam porttitor massa euismod arcu egestas, at dictum enim imperdiet.

Duis vestibulum, sapien at posuere tempor, mauris turpis varius nisl, quis consectetur felis leo eu mi.

Nullam at sapien dictum, tristique dui quis, bibendum ipsum.

Fusce semper rutrum sollicitudin. Proin lacinia molestie neque non aliquam. Maecenas commodo sodales nunc auctor dignissim.

Ut lectus libero, elementum eu interdum et, efficitur eu odio.

Nulla scelerisque nibh ut tortor finibus porta.

Pellentesque maximus nunc in aliquet malesuada. Etiam ac auctor ex.


Sed ac egestas urna, a sagittis lacus.

4 个答案:

答案 0 :(得分:1)

你可以使用sed。

sed 's/.\+/&\n/g' file

.\+匹配一个或多个字符,因此这只匹配至少包含一个字符的行。替换中的&指的是匹配的字符。

答案 1 :(得分:1)

sed '#n
1h;1!H;${x
   s/\n/³/g
:cycle
   s/\([^³[:space:]]\{1,\}[[:space:]]*\)³\([[:space:]]*[^³[:space:]]\{1,\}\)/\1³³\2/g
   t cycle
   s/³/\
/gp
   }' YourFile
  • 需要首先加载缓冲区中的文件以了解周围(相对于新行)字符串
  • 使用任意cahr替换新行(允许限制此char,posix sed不允许使用新行)
  • 在2个非空(或唯一的空间)字符串
  • 之间添加新行
  • 如果发生,再次循环以允许甚至同伴串出现也适用
  • 重置新行char
  • 打印结果

答案 2 :(得分:1)

对于您要求的(几乎)精确输出,您可以使用

awk 'x{if(NF)print "";x=0}NF{x=1}1' file

输出

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce fermentum, libero eget interdum varius, arcu magna sagittis massa, a viverra mi mauris nec nulla.

Nam porttitor massa euismod arcu egestas, at dictum enim imperdiet.


Duis vestibulum, sapien at posuere tempor, mauris turpis varius nisl, quis consectetur felis leo eu mi.

Nullam at sapien dictum, tristique dui quis, bibendum ipsum.

Fusce semper rutrum sollicitudin. Proin lacinia molestie neque non aliquam. Maecenas commodo sodales nunc auctor dignissim.

Ut lectus libero, elementum eu interdum et, efficitur eu odio.

Nulla scelerisque nibh ut tortor finibus porta.

Pellentesque maximus nunc in aliquet malesuada. Etiam ac auctor ex.


Sed ac egestas urna, a sagittis lacus.

解释

x{if(NF)print "";x=0}

如果设置了x,则将其设置为零。如果该行的字段数超过零(如果NF(字段数)不为0),则打印换行符。

NF{x=1}

如果该行上有字段,则将x设置为1

1

默认为true并打印该行。


资源

http://www.thegeekstuff.com/2010/01/8-powerful-awk-built-in-variables-fs-ofs-rs-ors-nr-nf-filename-fnr/

答案 3 :(得分:0)

我不清楚你真正想要输出的是什么,但也许你只是希望拥有一致的双倍间距输出。在那种情况下:

 awk '/./{printf "%s\n\n", $0}'

请注意,这将处理仅包含空格的行不同于空行(不带字符的行)。如果重要,你可以尝试:

awk '!/^ *$/{printf "%s\n\n", $0}'

或该主题的变体。