具有正则表达式的grep的范围

时间:2012-06-13 11:36:20

标签: regex linux grep

我正在尝试使用带有Linux的grep命令的正则表达式

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

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

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

它给我的一切都是空的!

这里有什么问题?

3 个答案:

答案 0 :(得分:3)

我认为grep不了解\w\s等字符类。尝试使用grep -Eegrep。 (grep -E相当于egrepegrep只需缩短即可。)

所以你的命令是:

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

答案 1 :(得分:2)

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

做了诀窍:))

答案 2 :(得分:0)

grep(1)默认使用POSIX Basic Regular Expressions-E使用时POSIX Extended Regular Expressions 选项。

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

POSIX character classes [[: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

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