awk范围正则表达式没有开始

时间:2017-05-17 19:55:05

标签: regex awk regex-negation

我有一些像这样的数据

Data                    Table ABC
Data
Stop
Data
Data                    Stop
Data                    Foo
Data                    Foo

我正在尝试为表ABC设置awk范围,直到在同一列中停止。 到目前为止我试过这个

awk '/Table ABC/,/Stop/' q
Data                    Table ABC
Data
Stop

但我希望得到

Data                    Table ABC
Data
Stop
Data
Data                    Stop

2 个答案:

答案 0 :(得分:2)

如果数据文件没有制表,但是格式化了固定长度,那么替代解决方案可能会更好用

awk '{m=match($0,"Table ABC"); if(m>0) p=m} 
   p {print; if(p==match($0,"Stop")) exit}' file

Data                    Table ABC
Data
Stop
Data
Data                    Stop

标记匹配的位置,开始打印,并在位置与结束模式匹配时结束。

无论匹配的位置如何,如果您想在结束模式的第二次出现时结束:

awk '/Table ABC/{p=1} p; /Stop/ && ++c==2{exit}' file

计数器c计算结束模式并在第二次退出。

答案 1 :(得分:1)

awk 范围模式解决方案:

awk -F"[[:space:]][[:space:]]+" '$2=="Table ABC", $2=="Stop"' file

输出:

Data                    Table ABC
Data
Stop
Data
Data                    Stop
  

范围模式由两个以逗号分隔的模式组成   形成'begpat, endpat'。它用于匹配连续范围   输入记录。第一个模式begpat控制范围   开始,而endpat控制模式结束的位置。