为什么我的 grep range 重复条件不起作用?

为什么我的 grep range 重复条件不起作用?

在 SO、Ask 和 Unix/Linux 上搜索解决方案,但我迷失了方向,无法弄清楚如何编写带有 grep 范围的条件:

经过:

1-20_something
100-200_something
2-100_something
11-333_something

代码有效,但仅限于1-9_something

if grep -q '[0-9]-[0-9]_something' "$foobar"; then
    echo "Additional Code"
fi

不起作用:

if grep -q '\d{1,3}-\d{1,3}_something' "$foobar"; then
    echo "Additional Code"
fi

这不起作用:

if grep -q '[0-9]{1,3}-[0-9]{1,3}_something' "$foobar"; then
    echo "Additional Code"
fi

最好的遍历方法是什么{1,3}

编辑:

为了帮助下一个可能遇到此问题的人,我进行了大量搜索,在给出答案后,我得到了以下结果:

答案1

在 BRE(基本正则表达式)中,花括号{ }被视为文字。来自man grep

   Basic vs Extended Regular Expressions
       In  basic regular expressions the meta-characters ?, +, {, |, (, and ) lose their
       special meaning; instead use the backslashed versions \?, \+, \{, \|, \(, and \).

因此你需要

grep '[0-9]\{1,3\}-[0-9]\{1,3\}_something'

-E或者使用开关启用扩展正则表达式模式

grep -E '[0-9]{1,3}-[0-9]{1,3}_something'

答案2

如果您启用了 PCRE(Perl 兼容正则表达式),您的第二次尝试应该会成功-P

grep -Pq '\d{1,3}-\d{1,3}_something'

\d不在 BRE 或 ERE 中,也不在额外的反斜杠表达式GNU Grep 具有这个功能,但是它是 Perl 的东西。

如果您启用了以下功能,第三次尝试应该会成功ERE(扩展正则表达式)

grep -Eq '[0-9]{1,3}-[0-9]{1,3}_something'

<exp>{m,n}不是 BRE(基本正则表达式)构造。

相关内容