首页 > 解决方案 > GREP 正则表达式无法正常工作,但我的正则表达式是正确的

问题描述

希望这是我犯的一个简单错误,总的来说,我对正则表达式相当陌生。基本上我正在尝试从文本文件中提取网站的名称。

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

似乎没有任何效果。如果有人能指出我正确的方向,我会很高兴。

标签: regexgrep

解决方案


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

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

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

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

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


推荐阅读