grep со строковой переменной и регулярным выражением - PullRequest
2 голосов
/ 21 марта 2011

Я пытаюсь сопоставить регулярное выражение, чья строковая часть содержится в переменной, как в:

matches=`grep "^"$*"[ ][0-9]\{1,\}" --count phonelist.txt`

, где регулярное выражение будет означать «любую строку в phonelist.txt, которая начинается с аргументов командной строкиза которым следует пробел и число с произвольным числом цифр ".Перепробовал много вещей, но, кажется, не могу получить это.Помощь

Ответы [ 3 ]

2 голосов
/ 21 марта 2011

Если вы хотите обрабатывать каждый аргумент командной строки как отдельный шаблон (т. Е. Вам нужно «совпадение», если строка начинается с любого аргументов командной строки), то вы можете построить всю расширенную регулярную единицуВыражение наподобие этого:

^(arg1|arg2|arg3|...) [0-9]+

Вы можете использовать IFS равным | и $* для автоматического расширения ваших позиционных параметров в эту форму, например:

(IFS=\|; echo "^($*) [0-9]+")

Скобкисформировать подоболочку, чтобы измененный IFS ограничивался командами в скобках (возможно, вы не захотите, чтобы этот параметр влиял на последующие части скрипта.

При использовании аргументов командной строки, содержащихрасширенные метасимволы регулярных выражений. Например, если вы хотите выполнить поиск литеральной строки foo(bar), вам потребуется передать в качестве аргумента что-то вроде foo\(bar\) (ERE, совпадающее с литеральной строкой), которое вы можете записать как 'foo\(bar\)' в фактической командной строке.

Наконец, верните ее в исходную команду иell grep ожидает расширенного регулярного выражения (-E):

matches=$(IFS=\|; grep -E "^($*) [0-9]+" --count phonelist.txt)

Подстановка команды $() фактически является своей собственной подоболочкой, поэтому измененное значение IFS не «уйдет» в более поздние частисценария.

2 голосов
/ 21 марта 2011

Попробуйте:

matches=$(grep "^$* [0-9]\+" --count phonelist.txt)
1 голос
/ 21 марта 2011

Я думаю, вы должны попробовать:

IFS=" "
matches=$(grep "^$* [0-9]\+" --count phonelist.txt)

Страница руководства bash гласит: $* "расширяется до одного слова со значением каждого параметра, разделенного первым символом специальной переменной IFS", тогда как при $@ "каждый параметр расширяется до отдельного слова. То есть "$@" эквивалентно "$ 1" "$ 2" ... ". В вашем регулярном выражении вам понадобятся все аргументы, объединенные в одно слово.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...