如何使用sed删除与“ +”号连接的行

时间:2018-08-26 03:38:09

标签: sed

在此示例中,“ +”号表示它连接前一行和当前行。因此,我想删除由“ +”连接的特定的一组线。 例如,我想从第一行删除到第四行(.groupA〜+ G H I)。请帮助我如何使用sed。

2 个答案:

答案 0 :(得分:1)

要删除以.groupA开头的行和所有连续的+前缀的行,一种容易理解的方法是:

sed '/\.groupA/,/^[^+]/ { /\.groupA/d; /\.groupA/!{/^\+/d} }' file

我们首先选择.groupA和第一个非+前缀行(包括)之间的所有内容,然后针对该行选择,删除第一行(包含.groupA),在其余各行中,我们将所有前缀为+的行删除。

请注意,如果要字面匹配,则需要转义正则表达式元字符(例如.+)。


稍微先进一点,但更优雅(仅使用一种起始块模式)方法使用循环来跳过匹配块的第一行,以及所有以以下开头的行+

sed -n '/\.groupA/ { :a; n; s/^\+//; ta }; p' file

答案 1 :(得分:1)

恕我直言,awk可以更轻松地完成此操作,但是请忽略一下,如果这不是您的选择。

因此,每次看到以.groupA开头的行时,我都设置一个标记d表示要删除,然后跳到下一行。如果我看到以+开头的行,并且当前正在删除,请跳至下一行。如果看到其他内容,请更改标志以表示我不再删除并打印该行:

awk '/^\.groupA/  {d=1; next}
     /^+/ && d==1 {next} 
                  {d=0; print}' file

示例输出

** Example **
abcdef ghijkl
.groupB abc def
+ JKL
+ MNO
+ GHI
opqrst vwxyz

您可以像这样将其投射为单线:

awk '/^\.groupA/{d=1; next} d==1 && /^+/ {next} {d=0;print}' file