在 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(基本正则表达式)构造。