7

我一生都无法为此找出正确的正则表达式。

我正在寻找的是一个正则表达式来匹配 Linux 文件权限的有效数字表示(例如,740 表示全读,777 表示全全)。到目前为止,我已经尝试了以下方法:

strtotest=740
echo "$strtotest" | grep -q "[(0|1|2|3|4|5|7){3}]"
if [ $? -eq 0 ]; then
    echo "found it"
fi

上面的问题是正则表达式匹配任何包含1-57其中的内容,而不管任何其他字符。例如,如果strtotest要更改为709,则条件为真。我也尝试过[0|1|2|3|4|5|7{3}][(0|1|2|3|4|5|7{3})]但这些都不起作用。

我使用的正则表达式是错误的,还是我错过了一些必须处理的东西grep

4

4 回答 4

7

你想要的可能是

grep -Eq "[0-7]{3}"

编辑:如果您使用它来查找具有某些权限的文件,您应该查看find( -perm) 或stat

于 2012-11-16T15:00:40.883 回答
5

适用于您的最简单和最明显的正则表达式是:

grep -q '(0|1|2|3|4|5|7)(0|1|2|3|4|5|7)(0|1|2|3|4|5|7)'

这是一个优化的版本:

grep -Eq '(0|1|2|3|4|5|7){3}'

由于 6 也可以表示权限,我们可以进一步优化它:

grep -Eq '[0-7]{3}'
于 2012-11-16T14:59:44.597 回答
3
  1. 您的正则表达式非常损坏:[ ]定义一个范围,其中的所有字符都在允许的集合中。
  2. grep 有一些额外的引用规则,可能需要额外的\.
  3. grep 在每一行中搜索您的正则表达式 - 如果您只想匹配行首,则需要^作为正则表达式中的第一个字符,如果您想匹配行尾,则需要$在行尾正则表达式。
于 2012-11-16T14:59:26.233 回答
1

仅供参考,您可以在 Bash 中使用 shell 模式

if [[ $strtotest == [0-7][0-7][0-7] ]]; then
    echo "Found it"
fi
于 2012-11-16T15:57:05.897 回答