我需要删除文件中的行,这些行在pattern1之后以及在模式2和pattern3 之间,如下所示:
aaaaaaaa
bbbbbbbb
pattern1 <-----After this line
cdededed
ddededed
pattern2
fefefefe <-----Delete this line
efefefef <-----Delete this line
pattern3
adsffdsd
huaserew
Run Code Online (Sandbox Code Playgroud)
请问您可以建议如何使用awk或sed或perl来完成此操作.
sed '/pattern1/,${ /pattern2/,/pattern3/{/pattern2/b; /pattern3/b; d;} };' file
Run Code Online (Sandbox Code Playgroud)
格式:
/pattern1/,$ {
/pattern2/,/pattern3/ {
/pattern2/b;
/pattern3/b;
d;
}
}
Run Code Online (Sandbox Code Playgroud)
解释:
/pattern1/,$是pattern1文件末尾之后的行数范围/pattern2/,/pattern3/之间的行的范围pattern2和pattern3/pattern2/b;并/pattern3/b;跳过范围中另外包含的pattern2和pattern3行(请参见sed常见问题)。d 删除范围内的其他行更新资料
根据注释,可以重写内部块:
//!d
Run Code Online (Sandbox Code Playgroud)
哪里:
//(空模式)上次使用的正则表达式(其在此情况下是两个匹配pattern2和pattern3!反转下一个命令,以便将其应用于除与模式匹配的行以外的所有内容d 删除这些行因此,完整的重写模式是:
/pattern1/,$ {
/pattern2/,/pattern3/ {
//!d
}
}
Run Code Online (Sandbox Code Playgroud)