2016-02-27 136 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在正则表达式的上下文中。