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