删除模式上方的所有内容

时间:2013-09-30 14:47:44

标签: unix sed awk html-table

我的问题是决定首先出现的三个模式,并在第一个模式之前删除everthing,同样删除最后一个模式后的everthing。

我知道要删除以上模式下面的everthing可以使用::

sed -n'/ pattern /,$ p'输入

grep -E -m1“pattern1 | pattern2 | pattern3”将打印包含第一个模式的行,我想我必须将此命令的输出提供给某些sed变量但不知道如何这样做。

1.PATTERN1
2.PATTERN2
3.PATTERN3

Line1这是一个示例行,例如没有任何意义请忽略
Line2仅用于给出示例PATTERN2以使我的查询对所有人清楚 Line3这是一个示例行,例如没有任何意义请忽略
Line4仅用于给出示例pattern1以使我的查询对所有人清楚 Line5这是一个示例行,例如没有任何意义请忽略
Line6仅用于给出示例pattern1以使我的查询对所有人清楚 Line7这是一个示例行,例如没有任何意义请忽略
Line8仅用于给出示例pattern2以使我的查询对所有人都清楚 Line9这是一个示例行,例如没有任何意义请忽略
Line10仅用于给出示例pattern3以使我的查询对所有人都清楚 Line11仅用于给出一个示例PATTERN2,以使我的查询对所有人都清楚 Line12仅用于给出示例pattern1以使我的查询对所有人都清楚 Line13仅用于给出一个示例pattern3以使我的查询清楚所有 Line14仅用于举例说明我的查询清除所有

期望的输出:

如果第一个模式是PATTERN2,而pattern3是三个模式中的最后一个模式,那么下面的输出是希望输出:

Line2仅用于给出示例PATTERN2以使我的查询对所有人清楚 Line3这是一个示例行,例如没有任何意义请忽略
Line4仅用于给出示例pattern1以使我的查询对所有人清楚 Line5这是一个示例行,例如没有任何意义请忽略
Line6仅用于给出示例pattern1以使我的查询对所有人清楚 Line7这是一个示例行,例如没有任何意义请忽略
Line8仅用于给出示例pattern2以使我的查询对所有人都清楚 Line9这是一个示例行,例如没有任何意义请忽略 Line10仅用于给出示例pattern3以使我的查询对所有人都清楚 Line11仅用于给出一个示例PATTERN2,以使我的查询对所有人都清楚 Line12仅用于给出示例pattern1以使我的查询对所有人都清楚 Line13仅用于给出示例pattern3以使我的查询对所有

清晰

2 个答案:

答案 0 :(得分:1)

sed是单行上简单替换的优秀工具,但对于其他任何东西,只需使用awk。您没有提供任何样本输入或预期输出或任何有关“模式”的含义的信息,因此这是一个未经测试的猜测,但它可能对您有用:

awk -v pats='pattern1|pattern2|pattern3' '
    { data[NR] = $0 }
    $0 ~ pats { if (start) end=NR; else start=NR }
    END{ for (i=start; i<=end; i++) print data[i] }
' file

评论版:

awk -v pats='pattern1|pattern2|pattern3' # or-separated list of patterns to be matched                            
    { data[NR] = $0 }                    # save current line in an array indexed by line number
    $0 ~ pats {                          # IF the current line matches any of the target patterns THEN
        if (start)                       #    IF the start line number is already recorded THEN
            end=NR;                      #        remember the current line number as the last one on which one of the patterns exists
        else                             #    ELSE
            start=NR                     #        remember the current line number as the first one on which one of the patterns exists
                                         #    ENDIF
    }                                    # ENDIF
    END{                                 # Once all of the file has been read into the array
        for (i=start; i<=end; i++)       # Loop through the array, starting at the first line on which one of the patterns was found
                                         # and ending on the last line on which one of the patterns was found
            print data[i]                #     Print the contents of the array at each line number in the loop.
    }
' file

答案 1 :(得分:1)

正如您所示,这将在第一次出现之前删除任何内容:

sed -n '/pattern/,$p' file

所以我们可以得到它的输出,反转它并应用 程序再次。然后反转 的输出,我们在第一个和最后一个匹配之间有所有文本:

seq 10 | sed -n '/4\|7/,$p' | tac | sed -n '/4\|7/,$p' | tac
4
5
6
7

我们可以把它放到一个函数中:

after() { sed -n '/'"$1"'/,$p'; }
between() { after "$1" | tac | after "$1" | tac; }
seq 10 | after '4\|7'
echo ===
seq 10 | between '4\|7'
4
5
6
7
8
9
10
===
4
5
6
7