我是正则表达式的新手,我正在尝试提取每场比赛的所有独特事件。因此,无论文件中有多少场足总杯比赛,它都应该返回足总杯,但只能返回一次
<Date="2014-02-15" Competition="FA Cup" Home="West Bromwich Albion">
基于公认的解决方案这个问题在这里,我尝试过这个:
grep -o 'Competition=".*\" 'Soccer_Data.xml' | sort --unique
但它返回了之后的所有内容Competition="
,但我只返回第一次出现双引号 ie 之前的所有内容"FA Cup"
。它还多次返回同一比赛!
为了防止多次返回,我尝试.*?
按照下面的解决方案中的建议使用,但这给了我相反的问题,因为它没有返回任何内容!
https://stackoverflow.com/questions/22444/my-regex-is-matching-too-much-how-do-i-make-it-stop
有人可以告诉我使用正确的正则表达式是什么吗?
答案1
grep
用途Posix 基本正则表达式默认情况下。
.*
在基本正则表达式中始终是贪心匹配,这意味着它匹配任何内容,直到最后的 "
在行中。
您可以使用[^"]*
相反 来匹配除 之外的任何内容"
。
grep -o 'Competition="[^"]*"' 'Soccer_Data.xml' | sort --unique
输出:
Competition="FA Cup"
或者,使用提供非贪婪修饰符 ( .*?
) 的 Perl 兼容正则表达式。如果您的版本提供了这一点,
您就可以使用(并且它会,因为您已在问题中添加了标签)。grep -P
grep
[ubuntu]
grep -Po 'Competition=".*?"' 'Soccer_Data.xml' | sort --unique
或仅FA CUP
使用例如接收“避开”--> \K
:
grep -Po 'Competition="\K[^"]*' 'Soccer_Data.xml' | sort --unique
输出:
FA Cup