我正在尝试使用带有Linux的grep命令的正则表达式
(^\s*\*\s*\[ \][^\*]+?(\w*\:[^\*]+\d$)|([^\*]+[.]com[.]au$))
当我在https://www.regextester.com尝试使用文件内容时,我得到了所需的结果,即所需的字段匹配,但当我尝试将其用作
时grep '(^\s*\*\s*\[ \][^\*]+?(\w*\:[^\*]+\d$)|([^\*]+[.]com[.]au$))' file1
它给我的一切都是空的!
这里有什么问题?
答案 0 :(得分:3)
我认为grep
不了解\w
和\s
等字符类。尝试使用grep -E
或egrep
。 (grep -E
相当于egrep
,egrep
只需缩短即可。)
所以你的命令是:
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
)和非贪婪重复(+?
),因为不可移植扩展。