我有一个清单...
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
。我更喜欢使用sed
,grep
和/或awk
。但不是perl
。
第一列可以有0、1或多个空格。它可以有一个数字,逗号。
第二列是1到4位数字。
第三列是一个单词。
第四列可以有多个空格。
第五位是1个或多个数字的数字。
第六个是“ true”或“ false”。
我已经玩了几个小时了。任何建议将不胜感激。
答案 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列)提供条件,那么它们可以做得更好。