在bash中匹配正确的正则表达式

时间:2016-02-27 04:24:10

标签: regex bash

$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

我试过" $ package $"进入终点但不能正常工作

2 个答案:

答案 0 :(得分:1)

假设您希望使用grep匹配变量值字面:使用-F选项执行 literal 子字符串搜索(而不是将搜索字符串解释为正则表达式,默认情况下grep执行此操作:

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

请注意,这将在每一行执行 substring 搜索。

如果您的意图是完全匹配'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//./\\.}\.")

请注意Bash参数扩展${package//./\\.}如何用于转义.字符。在变量值\.中,以确保grep在正则表达式的上下文中将它们视为文字 .字符。

答案 1 :(得分:0)

awk救援。我想你想要正则表达式反过来,试试这个而不是grep

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

或者只是将您的包定义更改为子字符串br.com.example.pc1