填充2列,但第一列中可能有空格

时间:2018-09-17 23:55:39

标签: regex unix grep

我有一个清单...

Group Chl# Code Name TMS ID Entitled
SPP Basic 1 VOD Charter On Demand 32046 true
Stream 2 KTVI KTVI 10750 true
Stream 4 KMOV KMOV 10575 true
Stream 5 KSDK KSDK 10685 true
Stream 6 SLATE VideoSlate 0 true
Stream 7 ION WRBU 11530 true
Stream 9 KETC KETC 10443 true
Stream 13 DAYSTAR WPXS Daystar Television 11337 true
Stream 14 SLATE VideoSlate 0 true
Tier 2 15 NFL NFL Network 34710 true
Stream 16 CSPAN CSPAN (Cable Satellite Public Affairs Network) 10161 true
Stream 17 UNI Univision Network (East) 11118 false
Tier 1 18 SECN SEC Network 89535 true
...
Select 104 HILLSNG The Hillsong Channel 29328 true
SPP Tier 1 106 BYUTV BYU - TV 21855 true
Tier 1 107 COWBOY The Cowboy Channel 10188 true
...
Tier 1 121 TNCK Nick - TeenNick 59036 true
SPP Tier 2 122 CI Crime and Investigation Network 48543 true
Tier 2 123 SMITH Smithsonian Channel 65799 true
...
Stream Sports, News & More 806 NBCSNHD NBC Sports Network HDTV 48639 true
SPP Tier 1 807 OLYHD Olympic Channel HDTV 104089 true
Select 809 GLFHD Golf Channel HDTV 61854 true
Tier 2 810 TNNSHD Tennis Channel HDTV 60316 true
Stream Sports, News & More 811 FS1HD Fox Sports 1 HD 82547 true

如果我输入一个数字,则需要在Chl#列中进行匹配。

例如,如果我在该数据中grep 121,它将返回

Tier 1 121 TNCK Nick - TeenNick 59036 true

如果我grep 122,它应该返回

SPP Tier 2 122 CI Crime and Investigation Network 48543 true

版本:

$ grep -V
GNU grep 2.6.3

此grep似乎无法识别这样的REGEX:

(?=x)d

这意味着仅在d之前匹配x,但不包括x

当我找到比赛时,我对最后一个字段(真或假)感兴趣。

我可以使用awk轻松获得:{print $NF}。不需要使用grep。我更喜欢使用sedgrep和/或awk。但不是perl

第一列可以有0、1或多个空格。它可以有一个数字,逗号。

第二列是1到4位数字。

第三列是一个单词。

第四列可以有多个空格。

第五位是1个或多个数字的数字。

第六个是“ true”或“ false”。

我已经玩了几个小时了。任何建议将不胜感激。

1 个答案:

答案 0 :(得分:0)

我认为以下正则表达式描述了您的数据:

^.* \d{1,4} \w+ .* \d+ (?:true|false)$

要搜索的数字在正则表达式中替换\d{1,4}。您可以对GNU -P使用grep选项来获取PCRE。不幸的是,您不能为此使用后视,因为后视必须是固定长度的,因此它们不能包含.*。因此,您可以使用它来匹配整行,然后使用其他内容提取最后一列。

grep -P '^.*? 121 \w+ .* \d+ (?:true|false)$' filename | awk '{print $NF}`

由于第一和第四列可以包含任意数量的单词,因此仍然可能出现误报。如果有任何限制,您可以为其他一些列(尤其是第3列)提供条件,那么它们可以做得更好。