2017-09-12 4 views
1

ユーザー入力$ 1が配列内に存在するかどうかを確認しようとしています。私は唯一の「aaa.bbb.ccc」または「ccc.ddd.aaa」で何を期待ドットで "grep"する方法 "。"正確には?

array=(
aaa.bbb.ccc 
ccc.ddd.aaa 
) 

echo ${array[@]} | grep -o -w "$1" 

を見つけることができます: そしてここでは私のコードです。 しかし、この場合、「aaa」や「ccc」のように検証に合格することもできます。 ドットが文字列の一部として扱われていないようです。

regexなどのgrepオプションを使用する必要がありますか?

答えて

3

それはあなたが望むように聞こえる:

  • リテラル全体入力行に対して
  • にマッチする文字列
  • したがって

、(リテラルマッチング用)-Fを使用して全ラインマッチングの-x:今

array=(
    aaa.bbb.ccc 
    ccc.ddd.aaa 
) 

printf '%s\n' "${array[@]}" | grep -Fx "$1" 

、のみリテラル文字列aaa.bbb.cccccc.ddd.aaaは、aaaなどのサブストリングではなく、一致します。
行全体が一致しているため、-o(各行の一致する部分のみを出力する)の使用は不要です。 ${array[@]}がないので

はまた、printf '%s\n' "${array[@]}"起因ワード分割及び電位グロブに空白の正規化と単一ライン上の要素は(適用echo ${array[@]}プリントに対し、独自のライン上の各配列要素を印刷するために使用されなければならないどのように注意してください"..."で囲まれている)。


あなたのアプローチの問題:

  • grep(基本的な)正規表現がデフォルトなので、.を含む$1値がその.は、「任意の単一文字」を意味すると解釈されていることになります。

  • echo ${array[@]}は、潜在的に望ましくない空白の正規化とグロブのために問題があります。 echo "${array[@]}" | grep -Fwo "$1"は改善されますが、偽陽性のリスクはわずかです。

+1

感謝 – Freddy

0
は、前 \.エスケープ

、それはaaと一致しませんが、試合a.aは以下となります。これはで動作するショーに

a.a 

echo a.a | grep '\.' 

出力を位置パラメータは、前のコードと同じように動作する小さな関数です:

foo() { echo "$2" | grep "$1" ; } 
foo '\.' a.a 

出力:あなたの詳細な返信用

a.a 
関連する問題