首页 > 解决方案 > 提取两个模式之间的行并使用 if 条件删除行之间的行

问题描述

我有一个包含以下内容的文件。我正在尝试提取具有匹配开始和结束模式的块,在这两者之间我想排除具有不匹配数字 id(可能是模式)的块。这里必须排除 [001] 以外的内容。002 可能不为人知。所以,我希望块只与 [001] 匹配。

文件包含,

    text [001] start
    line 1
    line 2
    text [002] mid start
    line 3     
    line 4
    text [002] mid end
    line 5
    line 6
    text [001] end

我需要该块,不包括不匹配的数字 id [002] 的块。

    text [001] start
    line 1
    line 2
    line 5
    line 6
    text [001] end

对于这个问题,我无法在互联网上得到明确的澄清。任何人都可以帮助解决这个问题,awk 或 sed 解决方案吗?

为了获得具有开始和结束模式的块,我正在尝试

   awk '/[001]/ && /start/, /001/ && /end/' File

标签: bashshellawksed

解决方案


假设您的块嵌套到任何深度并且从不重叠:

$ cat tst.awk
BEGIN { tgtId="001" }

match($0,/\[[0-9]+\]/) {
    id = substr($0,RSTART+1,RLENGTH-2)
    state = $NF
}

state == "start"  { isTgtBlock[++depth] = (id == tgtId ? 1 : 0) }

isTgtBlock[depth] { print }

state == "end"    { --depth }

{ id = state = "" }

$ awk -f tst.awk file
    text [001] start
    line 1
    line 2
    line 5
    line 6
    text [001] end

推荐阅读