grep 所有以某个子字符串开头并以第一个引号结束的字符串

grep 所有以某个子字符串开头并以第一个引号结束的字符串

我是正则表达式的新手,我正在尝试提取每场比赛的所有独特事件。因此,无论文件中有多少场足总杯比赛,它都应该返回足总杯,但只能返回一次

<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 -Pgrep[ubuntu]

grep -Po 'Competition=".*?"' 'Soccer_Data.xml' | sort --unique

或仅FA CUP使用例如接收“避开”--> \K:

grep -Po 'Competition="\K[^"]*' 'Soccer_Data.xml' | sort --unique

输出:

FA Cup

相关内容