GREP正则表达式无法正常工作,但是我的正则表达式正确

时间:2020-02-18 22:38:00

标签: regex grep

希望这是我犯的一个简单错误,对于regex来说,我一般是新手。基本上,我试图从文本文件中提取网站的名称。

myfile.txt示例:

您好,请在当天的余下时间访问%sbananas.com%s。再见!

我正在尝试从中提取 这个词。我的正则表达式如下:

/(?<=m%s)(.*?)(?=\.com)/

在网上使用regexr可以很好地工作,但是在GREP代码中,我只是想不出如何使其正常工作。它不返回任何结果。我尝试了以下几种变体:

grep "/(?<=m%s)(.*?)(?=\.com)/" myfile.txt
grep -E "/(?<=m%s)(.*?)(?=\.com)/" myfile.txt
grep '/(?<=m%s)(.*?)(?=\.com)/' myfile.txt
grep "(?<=m%s)(.*?)(?=\.com)" myfile.txt
grep '(?<=m%s)(.*?)(?=\.com)' myfile.txt

似乎没有任何作用。我希望有人能指出正确的方向。

1 个答案:

答案 0 :(得分:2)

grep和其他Unix工具中的正则表达式存在的问题是它们通常支持一种,两种或三种不同的正则表达式。这些是:

  • 基本正则表达式(BRE)
  • 扩展的正则表达式(ERE或EREG)
  • Perl兼容的正则表达式(PCRE或PREG)

您的模式采用PCRE语法,因此您需要将模式标识为一个(使用-P)。请注意,我还删除了m=之间的%(我不知道该怎么做)。

grep -Po "(?<=%s)(.*?)(?=\.com)" myfile.txt

对于-o,您说您只想打印匹配的部分。我的grep手册页在grep中将PCRE声明为实验性的,因此可能会出现细分错误或评估花费异常多时间的情况。