文字列が与えられたら、正確に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
いつでもegrep
Linux / 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