删除字符串后的一个或多个空行

时间:2014-09-18 14:13:32

标签: regex awk sed

#+BEGIN_HTML

some html
more html

#+END_HTML

我有一些文件包含如上所述的文字。我想删除#+ BEGIN_HTML之后的任何空行,所以我最终得到:

#+BEGIN_HTML
some html
more html

#+END_HTML

该文件在其他地方包含空行,我不想删除。我正在努力想出一个让我这样做的正则表达式。

6 个答案:

答案 0 :(得分:1)

以下是awk解决方案:

awk '!NF && f {next} 1; NF {f=0} /#\+BEGIN_HTML/ {f=1}' file
#+BEGIN_HTML
some html
more html

#+END_HTML

或者随着Jidder的消化:

awk '!NF&&f{next}{f=/#\+BEGIN_HTML/}1' file

答案 1 :(得分:1)

使用sed

sed ':a;/^#+BEGIN_HTML/{N;/\n./!s/\n.*//;ta}' file

创建标签a。对于以#+BEGIN_HTML开头的行,将下一行追加到模式空间。替换从换行到下一行结尾的所有内容,除非它不是空行。如果替换修改了模式空间,则重复循环。

答案 2 :(得分:0)

使用awk

awk '/#\+BEGIN_HTML/{print; skip=1; next} skip {if (!NF) next; else skip=0} 1' file
#+BEGIN_HTML
some html
more html

#+END_HTML

答案 3 :(得分:0)

通过perl,

$ perl -0777pe 's/(?<=^#\+BEGIN_HTML\n)\n+//g' file
#+BEGIN_HTML
some html
more html

#+END_HTML

perl -00pe 's/(?<=^#\+BEGIN_HTML\n)\n+//g' file

答案 4 :(得分:0)

尝试:

sed -e ':1' -e '/#+BEGIN_HTML/{$!N;/\n$/s///;t1}'

答案 5 :(得分:0)

这是另一个使用awk的人:

awk 'f{if(!NF)next;f=0}/#\+BEGIN_HTML/{f=1}1' file
模式匹配时,

f设置为1。当f为1时,将跳过空行(其中NF为0)。当行不再为空时,f设置为0。

测试出来:

$ cat file
#+BEGIN_HTML



some html
more html

#+END_HTML
$ awk 'f{if(!NF)next;f=0}/#\+BEGIN_HTML/{f=1}1' file
#+BEGIN_HTML
some html
more html

#+END_HTML