首页 > 解决方案 > 在字符序列上使用 grep 案例场景

问题描述

试图在目录上#hīc"使用 grep 表达式捕获字符串grep -r -i '#\w[ēāīōū]*\w+\"' *.html我在regex101 站点上测试了正则表达式字符串,它在那里工作。Grep 3.4 对比

标签: regexgrep

解决方案


您遇到的问题是+. POSIX grep 中的 BRE 没有+1 或更多,这将被解释为'+'grep 正在寻找的文字。

POSIX grep也不\w支持速记字符类(尽管它不被禁止,并且某些平台,例如 BSD 和 OS X 确实\w支持。)

标准 POSIX 字符类将[:alnum:]具有一些支持[:word:][:name:],取决于您的本地设置和 grep,相当于\w. 可以在此处此处查看其他课程。这些字符类也存在差异,例如是否_包含在类中以及是否包含非 ascii 字母。

对于相同的匹配(确保 1 或更多而不是 0 或更多*单独)使用\w\w*而不是\w+(或者[[:alnum:]][[:alnum:]]*如果您的 grep 不支持\w

这适用于 BSD/Mac grep:

echo 'line 1
line 2
#hīc"
line 4' | grep '#\w[ēāīōū]*\w\w*"'
#hīc"

或者使用 GNU grep 中的 PCRE 引擎来实现 PCRE 兼容的正则表达式。这就是 regex101 中使用的内容。

echo 'line 1
line 2
#hīc"
line 4' | ggrep -P '#\w[ēāīōū]*\w+"'
#hīc"

但这-P仅在 GNU grep 中;不在 POSIX 中。


推荐阅读