7

このための適切な正規表現を一生理解することはできません。

私が探しているのは、Linuxファイルのパーミッションの有効な数値表現に一致する正規表現です(たとえば、all-read-noneの場合は740、all-all-allの場合は777)。これまで私は以下を試しました:

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

上記の問題は、他の文字に関係なく、正規表現がその中1-5または中のすべてに一致することです。7たとえば、strtotestに変更された709場合、条件はtrueになります。私も試しましたが、うまくいきません[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は、各行内で正規表現を検索します。行の先頭でのみ一致させる場合^は、正規表現の最初の文字として必要です。行の終わりで一致させる場合は、$の最後でaが必要です。正規表現。
于 2012-11-16T14:59:26.233 に答える
1

参考までに、Bashのシェルパターンでそれを行うことができます

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