Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 删除图案上方的所有内容_Unix_Sed_Awk_Html Table - Fatal编程技术网

Unix 删除图案上方的所有内容

Unix 删除图案上方的所有内容,unix,sed,awk,html-table,Unix,Sed,Awk,Html Table,我的问题是从三种模式中选择哪一种先出现,删除第一种模式之前的所有内容,同样删除最后一种模式之后的所有内容 我知道,要删除上面的所有内容,可以使用以下命令: sed -n '/pattern/,$p' input grep-E-m1“pattern1 | pattern2 | pattern3”将打印包含第一个图案的行,我想我必须将此命令的输出馈送给sed的某个变体,但不确定如何执行 模式1 模式2 模式3 第1行这是一个示例行,没有任何意义,请忽略 第2行仅用于给出一个示例模式2,以使所有

我的问题是从三种模式中选择哪一种先出现,删除第一种模式之前的所有内容,同样删除最后一种模式之后的所有内容

我知道,要删除上面的所有内容,可以使用以下命令:

sed -n '/pattern/,$p' input  
grep-E-m1“pattern1 | pattern2 | pattern3”
将打印包含第一个图案的行,我想我必须将此命令的输出馈送给
sed的某个变体,但不确定如何执行

  • 模式1
  • 模式2
  • 模式3
  • 第1行这是一个示例行,没有任何意义,请忽略
    第2行仅用于给出一个示例模式2,以使所有人都清楚地了解我的查询
    第3行这是一个示例行,没有任何意义,请忽略
    第4行仅用于给出示例模式1,以使所有人都清楚地了解我的查询
    第5行这是一个示例行,没有任何意义,请忽略
    第6行仅用于给出一个示例模式1,以使所有人都清楚地了解我的查询
    第7行这是一个示例行,没有任何意义,请忽略
    第8行仅用于给出一个示例模式2,以使所有人都清楚地了解我的查询
    第9行这是一个示例行,没有任何意义,请忽略
    第10行仅用于给出一个示例模式3,以使所有人都清楚地了解我的查询
    第11行仅用于给出示例模式2,以使所有人都清楚地了解我的查询
    第12行仅用于给出示例模式1,以使所有人都清楚地了解我的查询
    第13行仅用于给出一个示例模式3,以使所有人都清楚地了解我的查询
    第14行只是为了给大家举个例子,让大家都明白我的问题

    所需输出:

    如果第一个图案是图案2,图案3是三个图案中的最后一个图案,则需要以下输出:

    第2行仅用于给出一个示例模式2,以使所有人都清楚地了解我的查询
    第3行这是一个示例行,没有任何意义,请忽略
    第4行仅用于给出示例模式1,以使所有人都清楚地了解我的查询
    第5行这是一个示例行,没有任何意义,请忽略
    第6行仅用于给出一个示例模式1,以使所有人都清楚地了解我的查询
    第7行这是一个示例行,没有任何意义,请忽略
    第8行仅用于给出一个示例模式2,以使所有人都清楚地了解我的查询
    第9行这是一个示例行,没有任何意义,请忽略 第10行仅用于给出一个示例模式3,以使所有人都清楚地了解我的查询
    第11行仅用于给出示例模式2,以使所有人都清楚地了解我的查询
    第12行仅用于给出示例模式1,以使所有人都清楚地了解我的查询

    第13行仅用于给出一个示例模式3,以使我的查询对所有人都清晰明了。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 patts='pattern1 | pattern2 | pattern3''
    {data[NR]=$0}
    $0~pats{if(start)end=NR;else start=NR}
    
    END{for(i=start;i如您所示,这将在第一次发生之前删除任何内容:

    sed -n '/pattern/,$p' file
    
    所以我们可以得到它的输出,反转它,然后应用 再次编程。然后反转输出,我们得到第一次和最后一次匹配之间的所有文本:

    seq 10 | sed -n '/4\|7/,$p' | tac | sed -n '/4\|7/,$p' | tac
    
    我们可以将其转化为一个函数:

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

    模式是字符串还是正则表达式?一个模式可以包含在另一个模式中吗?一个模式需要是一个完整的单词吗?模式匹配必须区分大小写还是不区分大小写(如您的示例所示)?您下面的解决方案在我的脚本中运行得非常完美。谢谢感谢这对我起了作用,您能解释一下上面的awk命令吗?我添加了一个注释版本。
    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