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