删除以出现在另一个模式之后的任意位置的模式开头的整行

删除以出现在另一个模式之后的任意位置的模式开头的整行

如何删除包含(任何行号中第一次出现)---的行之后的任何行号中出现的任何行?# Match


编辑:

#Match与 以 开头的行之间的关系---是,后者可以存在于 之前或之后,#Match但只有当它存在于 之后时才应将其删除#Match。 –

输入样本

hello

this is sample
--- sdafasdf
adsafasf
asfas
fasf

#Match
this is sample
adsafasf
asfas    dafasf
------ lots of fun
---- test

adsfasf****

预期输出

hello

this is sample
--- sdafasdf
adsafasf
asfas
fasf

#Match
this is sample
adsafasf
asfas    dafasf

adsfasf****

答案1

根据你的问题,我刚刚创建了这个text.txt。如果您的文件内容不同,请告诉我们。

bash-4.1$ cat test.txt
#Match
---- test
hello
#Match
this is sample
adsafasf
asfas
fasf
#Match
------ funny
------ lots of fun
#Match
dafasf
adsfasf

bash-4.1$ awk '/#Match/ {flag=1} flag && /^---/ {flag=0;next} 1' test.txt
#Match
hello
#Match
this is sample
adsafasf
asfas
fasf
#Match
------ lots of fun
#Match
dafasf
adsfasf

答案2

使用sed

sed -e '/#Match/ {n; /^---/d; }' infile

n命令将下一行输入读取到模式空间中,并/^---/d删除该行(如果该行以 开头),且---仅当上一行与 匹配时#Match

回答修改后的问题:

sed -e '/#Match/,$ { /^---/d; }' infile

答案3

怎么样

awk '/#Match/,EOF {if (/^---/) next} 1' file

从一行匹配开始#Match,直到变量EOF变为 true(这永远不会发生,因此 = 输入流的结尾),如果它在开头匹配三个(或更多)破折号,则跳过实际行。

相关内容