正则表达式的grep范围

7
我正在尝试在Linux的grep命令中使用正则表达式。
(^\s*\*\s*\[ \][^\*]+?(\w*\:[^\*]+\d$)|([^\*]+[.]com[.]au$))

当我在https://www.regextester.com上使用文件内容测试时,我得到了所需的结果,即匹配了所需的字段。但是当我尝试将其用作

grep '(^\s*\*\s*\[ \][^\*]+?(\w*\:[^\*]+\d$)|([^\*]+[.]com[.]au$))' file1

所有它给我的只是一个空值!

问题出在哪里呢?

3个回答

3
我认为grep不理解像\w\s这样的字符类。请尝试使用grep -Eegrep。(grep -E相当于egrepegrep只是更短更方便输入。)
因此,你的命令应该是:
egrep '(^\s*\*\s*\[ \][^\*]+?(\w*\:[^\*]+\d$)|([^\*]+[.]com[.]au$))' file1

很酷,但我如何进行多行搜索? 假设grep逐行工作。 我想要一个多行搜索。 那么有什么解决方案吗? - Kiran Vemuri
1
@KiranVemuri 这是一个不同的问题,与您在此提出的问题不同。这个主题已经被这个SO问题涵盖了。 - Tim Pote
默认情况下,egrep也不理解\s或\w。但是,如果PCRE已经编译过了,你可以使用--perl-regexp标志。 - Todd A. Jacobs
@CodeGnome RTM:http://www.gnu.org/software/grep/manual/html_node/The-Backslash-Character-and-Special-Expressions.html#The-Backslash-Character-and-Special-Expressions - Tim Pote
1
虽然公平地说,它确实表示应该对“grep”也起作用。我相当确定在旧版本中那是一个“egrep”扩展。 - Tim Pote

2
pcregrep -M  '(^\s*\*\s*\[ \][^\*]+?(\w*\:[^\*]+\d$)|([^\*]+[.]com[.]au$))'

做到了:)

0

grep(1) 默认使用 POSIX 基本正则表达式,而在使用 -E 选项时,则使用 POSIX 扩展正则表达式

POSIX 正则表达式 中,非特殊字符在转义时具有未定义的行为,例如 \s,并且没有非贪婪匹配的语法,例如 +?。此外,在 BRE 中,+| 运算符不可用,并且必须转义括号才能执行分组。

POSIX 字符类 [[:space:]][[:alnum:]_] 分别是 \s\w 的可移植替代品。

通过排除下一个匹配字符可以用来模拟非贪婪匹配,例如 [^*]+?\w*: 等价于 [^*[:alnum:]_:]+[[:alnum:]_]*:

给定的正则表达式可以表示为多个BRE:

grep -e '^[[:space:]]*\*[[:space:]]\{1,\}\[ \][^*[:alnum:]_+]\{1,\}[[:alnum:]_]*:[^*]\{1,\}[[:digit:]]$' \
    -e '[^*]\{1,\}\.com\.au$' file1

或者一个ERE:

grep -E '^[[:space:]]*\*[[:space:]]*\[ \][^*[:alnum:]_:]+[[:alnum:]_]*:[^*]+[[:digit:]]$|[^*]+\.com\.au$' \
    file1

请注意,GNU 实现的 grep(1) 允许使用短字符类 (\s\w) 和非贪婪重复 (+?),作为不可移植的扩展功能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接