我需要在比赛前删除空行。
所以给出了文件:
random text
more random text
#matchee
我需要匹配模式/ #matchee /,然后删除之前的空白行。
这是我尝试过的 - 没有成功:
sed '/^[ \t]*$/{N;/#matchee.*$/{D;}}' file.txt
我的逻辑:
基本上/ matchee /是一个必须保持的常量,我需要删除一个额外的 来自/ #matchee /.
分隔的记录文件中每条记录的空白行这对任何事都没有影响。我是RTFM-ing,D
应该删除模式
空间直到换行符。由于N
附加换行符加下一行 - 这应该会产生预期的结果....唉......不,不再。这是因为匹配基本上没有(空白)吗?
答案 0 :(得分:5)
如果存在奇数个空行,您的方法将起作用,但如果存在偶数,则会失败。您的sed
脚本是以下循环。
#matchee
,则从模式空间中丢弃 L1 您会注意到 L2 始终打印,即使它是空白的,后跟一行包含#matchee
的行。它受到以下事实的保护:它紧跟在奇数个空行之后。
编辑添加:要解决上述问题,可以使用:
命令创建标签并使用b
命令添加内部循环它的“分支”(转到)。这样:
sed '/^[ \t]*$/{: a;N;/#matchee/!P;D;/^[ \t]*$/b a}' file.txt
是以下循环:
a
←这是一个无操作,只是goto
#matchee
,请打印 L1 goto a
答案 1 :(得分:2)
这可能对您有用:
sed '$!N;s/^\s*\n\(#matchee.*\)/\1/;P;D' file.txt
如何运作:
sed '$!N;l;s/^\s*\n\(#matchee.*\)/\1/;P;D' file.txt
N.B。 P
打印到第一个换行符,D
删除第一个换行符并开始一个新的循环而不读取另一个记录,除非没有换行符,在这种情况下它的行为类似d
并读取在一条线上并开始下一个周期。