2016-02-27 214 views
-2
$package=br.com.example.pc1.test 
search=$(adb shell pm list packages | grep "$package") 

br.com.example.pc1 - 比賽:(匹配正確的正則表達式

br.com.example.pc1.test - 比賽:)

我想給數學來完成它:br.com.example.pc1.test

我試試「$包$」,在最後一行來獲得,但沒有工作

+1

你能再解釋一下這個問題是什麼嗎?你匹配的結果你不想匹配? – NickLamp

+0

另請注意,shell變量_assignments_不能是'$' - 前綴;你只能使用'''to _reference_變量。 – mklement0

回答

0

awk來救援。我猜你想要的正則表達式的工作周圍的其他方法,嘗試,而不是grep的這個

$ search=$(adb shell pm list packages | awk -v k=$package 'k~$0') 

或只是你的包定義更改爲子br.com.example.pc1

1

假設你想匹配一個變量的值字面上使用grep:使用-F選項,其執行一個字面字符串搜索(而不是解釋搜索字符串作爲正則表達式,其grep默認完成):

package='br.com.example.pc1.test' 
search=$(adb shell pm list packages | grep -F "$package") 

注意,這將執行每行一個搜索。


如果你的目的是要匹配'br.com.example.pc1.test'正是(即,只有當整個輸入線比賽),加-x

package='br.com.example.pc1.test' 
search=$(adb shell pm list packages | grep -Fx "$package") 

如果你的目的是要匹配子字符串開始br.com.example.pc1.test但包含附加組件,只需追加.的搜索字符串:

package='br.com.example.pc1.test' 
search=$(adb shell pm list packages | grep -F "$package.") 

然而,這仍然br.com.example.pc1.test之前匹配字符線。

爲了確保搜索字符串僅在開始行的比賽,你需要用錨^正則表達式:

package='br.com.example.pc1.test' 
search=$(adb shell pm list packages | grep "^${package//./\\.}\.") 

注意如何猛砸參數擴展${package//./\\.}被用來逃跑字符爲.。在變量值中爲\.以確保grep將它們視爲文字. chars在正則表達式的上下文中。