使用正则expression式的grep的范围

我正在尝试使用Linux的grep命令的正则expression式

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

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

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

它给我的是一个空!

这里有什么问题?

我不认为grep理解像\w\s这样的字符类。 尝试使用grep -Eegrep 。 ( grep -E相当于egrepegrep只是输入较短)。

所以你的命令是:

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

做了诀窍:)

grep(1)默认情况下使用POSIX Basic正则表达式 ,使用-E选项时使用POSIX Extended正则表达式 。

在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 

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