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

br.com.example.pc1 - матч :(Match правильное регулярное выражение в Баш

br.com.example.pc1.test - матч :)

Я хочу дать математику, чтобы закончить его: br.com.example.pc1.test

у меня есть попробовать «$ пакет $», чтобы получить в финале линии, но не работает

+1

Не могли бы вы еще немного объяснить, в чем проблема? Вы сопоставляете результаты, которые вы не хотите сопоставлять? – NickLamp

+0

Также обратите внимание, что переменная оболочки _assignments_ должна _not_ быть '$' -prefixed; вы используете переменные '$' 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//./\\.}\.") 

Обратите внимание, как Bash расширения параметр ${package//./\\.} используется, чтобы избежать символы .. в переменном значении как \., чтобы гарантировать, что grep рассматривает их как literal. символы в контексте регулярного выражения.

Смежные вопросы