2017-09-12 63 views
1

我試圖檢查用戶輸入$ 1是否存在於一個數組中。 這裏是我的代碼:如何用點「數組」grep「。」恰恰?

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

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

我期望是唯一的「aaa.bbb.ccc」或「ccc.ddd.aaa」中可以找到。 但是,在這種情況下,像「aaa」或「ccc」也可以通過驗證。 看起來像點不被視爲字符串的一部分。

我應該使用正則表達式還是其他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(僅輸出每行的匹配部分)是不必要的。

還要注意printf '%s\n' "${array[@]}"必須如何用於打印每個數組元素的行中,而echo ${array[@]}打印施加由於字分裂和潛在的通配在單個行中的元素(與空白正常化,因爲${array[@]}是不封閉在"...")。


與方法的問題:

  • grep默認(基本)正則表達式,所以會導致在..一個$1值被解釋爲「任何單個字符」。

  • echo ${array[@]}由於潛在的不需要的空白標準化和通配符問題,如上所述; echo "${array[@]}" | grep -Fwo "$1"會有所改進,但會帶來輕微的誤報風險。

+1

感謝您的詳細答覆 – Freddy

0

逃離.與前面的\,並且它不會匹配aa比賽a.a

echo a.a | grep '\.' 

輸出:

a.a 

爲了證明這一點也適用位置參數,這裏有一個小函數,其行爲與前面的代碼非常相似:

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

輸出:

a.a 
相關問題