我試圖檢查用戶輸入$ 1是否存在於一個數組中。 這裏是我的代碼:如何用點「數組」grep「。」恰恰?
array=(
aaa.bbb.ccc
ccc.ddd.aaa
)
echo ${array[@]} | grep -o -w "$1"
我期望是唯一的「aaa.bbb.ccc」或「ccc.ddd.aaa」中可以找到。 但是,在這種情況下,像「aaa」或「ccc」也可以通過驗證。 看起來像點不被視爲字符串的一部分。
我應該使用正則表達式還是其他grep選項?
我試圖檢查用戶輸入$ 1是否存在於一個數組中。 這裏是我的代碼:如何用點「數組」grep「。」恰恰?
array=(
aaa.bbb.ccc
ccc.ddd.aaa
)
echo ${array[@]} | grep -o -w "$1"
我期望是唯一的「aaa.bbb.ccc」或「ccc.ddd.aaa」中可以找到。 但是,在這種情況下,像「aaa」或「ccc」也可以通過驗證。 看起來像點不被視爲字符串的一部分。
我應該使用正則表達式還是其他grep選項?
這聽起來像你想:
因此,使用-F
(對於文字匹配)和-x
整行匹配:
array=(
aaa.bbb.ccc
ccc.ddd.aaa
)
printf '%s\n' "${array[@]}" | grep -Fx "$1"
現在,只有文字字符串aaa.bbb.ccc
和ccc.ddd.aaa
將匹配,而不是子如aaa
。
由於您匹配整條線,因此使用-o
(僅輸出每行的匹配部分)是不必要的。
還要注意printf '%s\n' "${array[@]}"
必須如何用於打印每個數組元素的行中,而echo ${array[@]}
打印施加由於字分裂和潛在的通配在單個行中的元素(與空白正常化,因爲${array[@]}
是不封閉在"..."
)。
與方法的問題:
grep
默認(基本)正則表達式,所以會導致在.
含.
一個$1
值被解釋爲「任何單個字符」。
echo ${array[@]}
由於潛在的不需要的空白標準化和通配符問題,如上所述; echo "${array[@]}" | grep -Fwo "$1"
會有所改進,但會帶來輕微的誤報風險。
逃離.
與前面的\
,並且它不會匹配aa
但將比賽a.a
:
echo a.a | grep '\.'
輸出:
a.a
爲了證明這一點也適用位置參數,這裏有一個小函數,其行爲與前面的代碼非常相似:
foo() { echo "$2" | grep "$1" ; }
foo '\.' a.a
輸出:
a.a
感謝您的詳細答覆 – Freddy