文字列の正確な桁数を一致させます。

文字列の正確な桁数を一致させます。

文字列が与えられたら、正確に7つの連続した数字が含まれているかどうかを確認する方法は?

たとえば、1505082または1505082_CSE_322そうでない、15050821または15050821_CSE_322

頑張った

grep -Eq [0-9]{7} <<< "1505082" 

戻ってき0ますが

grep -Eq [0-9]{7} <<< "15050821"` 

また返されました0

私は何が間違っていましたか?

答え1

はい、次のようになります(正規表現を引用しない場合はシェルグローブとして解釈されます)。

grep -Eq '[0-9]{7}' <<< "1505082"

grepは7桁の数字と一致します。 qを次に置き換えると、一致するものを確認できますo

$ grep -Eo '[0-9]{7}' <<< "1505082"; echo "$?"
1505082
0

はい、これも一致します:

$ grep -Eq '[0-9]{7}' <<< "150508299999"; echo "$?"
1505082
0

9をすべて削除します。
問題は、固定されていない一致を実行していることです。これは7桁の数字です(以上)数字。

あなたはできますアンカーそして:

$ grep -Eq '^[0-9]{7}$' <<< "15050829999"; echo "$?"
1

7桁の数字の一致どこかに数字以外の数字が後ろまたは前に来る場合は、まったく異なるアンカーが必要です。

$ grep -oP '(?<=^|[^0-9])[0-9]{7}(?=[^0-9]|$)' <<< "1505082"; echo $?
1505082
0

$ grep -oP '(?<=^|[^0-9])[0-9]{7}(?=[^0-9]|$)' <<< "1505082_CSE_322"; echo $?
1505082
0

$ grep -oP '(?<=^|[^0-9])[0-9]{7}(?=[^0-9]|$)' <<< "1505082999_CSE_322"; echo $?
0

これはプレビュー一致で、1つは振り返りです。

(?<=^|[^0-9])

^文字列()の先頭または数字以外の項目と一致します。もう一つはプレビューです。

(?=[^0-9]|$)

数字または文字列の終わり以外の項目と一致します。


より単純な正規表現を使用する唯一の代替方法は、ランダムなExtended(またはそれ以上の)数を抽出し、7それが正確に7桁であることを確認することです。

$ echo "150508299_CSE_322" | 
          grep -oE '[0-9]{7,}' | 
                  grep -qE '^[0-9]{7}$'; echo "$?"
1

答え2

状況が複雑になると、grepいつでもegrepLinux / Unixシステムで利用可能なプログラミング言語を使用して一致/正規表現の助けを借りることができます。

システムにPerlまたはRubyがある場合は、1行で実行できます。

echo 1234567| ruby -lne 'print if /^\d{7}$/'

echo 1234567| perl -lne 'print if /^\d{7}$/'

または

cat file.txt | ruby -lne 'print if /^\d{7}$/'

答え3

Bashのバイナリ演算子を使用しないのはなぜですか=~

$ [[ 1505082 =~ [0-9]{7} ]] && echo matched
matched

詳細については、次を参照してください。http://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Conditional-Constructs

関連情報