回到这个讨论: 打印两个模式之间的所有行,排他,仅第一个实例(在 sed、AWK 或 Perl 中)
一旦结束模式是起始模式的子字符串,所提出的解决方案就会失败。
示例输入:
aaa
PATTERNSTART
bbb
ccc
ddd
PATT
eee
产生输出故障:
awk '/PATT/{exit} f; /PATTERNSTART/{f=1}' dat
返回结果为空,与预期不符
bbb
ccc
ddd
特殊情况:
- 如果未找到起始模式,则不执行任何操作
- 如果没有遇到结束模式,则从起始模式打印到文件末尾
- 仅考虑第一次出现的开始/结束模式对
不确定我是否找到了所有极端情况。上述情况以外的极端情况可能会得到规范处理。谢谢。
您必须使用正则表达式的开始和结束锚点来避免匹配部分模式:
或者使用字符串比较并完全避免使用正则表达式:
确保使用锚点:
如前所述,如果结束模式成立,那么开始模式也成立。为了防止这种情况,要么使用
^
和$
锚点,要么直接说第一个模式-动作对不是起始模式和结束模式,如下所示,让dat
内容为然后
给出输出
观察它的表现与带锚的解决方案不同,因为它将被视为
PATTY
结束模式。您需要细化您的要求以确定在这种情况下会发生什么。(在 GNU Awk 5.1.0 中测试)