Как избежать ранее неизвестной строки в регулярном выражении? - PullRequest
7 голосов
/ 16 марта 2011

Мне нужно egrep строка, которая не известна до выполнения и которую я получу через переменную оболочки (shell - это bash, если это имеет значение).Проблема в том, что строка будет содержать специальные символы, такие как фигурные скобки, пробелы, точки, косые черты и т. Д.

Если я знаю строку, я могу экранировать специальные символы по одному, но как я могу это сделать?для всей строки?

Выполнение строки через сценарий sed для префикса каждого специального символа с \ может быть идеей, мне все еще нужно rtfm, как должен быть написан такой сценарий.Я не знаю, есть ли другие, лучшие, варианты.

Я прочитал re_format(7), но, похоже, не существует такой вещи, как "взять всю следующую строку как литерал" ...

РЕДАКТИРОВАТЬ: чтобы избежать ложных срабатываний, я должен также добавить обнаружение новой строки в шаблон, например.egrep '^myunknownstring'

Ответы [ 3 ]

7 голосов
/ 16 марта 2011

Если вам нужно встроить строку в большее выражение, sed - это то, как я бы это сделал.

4 голосов
/ 16 марта 2011

Используйте флаг -F, чтобы сделать ШАБЛОН фиксированной литеральной строкой

$ var="(.*+[a-z]){3}"
$ echo 'foo bar (.*+[a-z]){3} baz' | grep -F "$var" -o
(.*+[a-z]){3}
0 голосов
/ 16 марта 2011

Вы пытаетесь защитить строку от неверного толкования как синтаксиса bash или пытаетесь защитить части строки от интерпретации как синтаксиса регулярного выражения?

Для защиты от удара:

grep поддерживает переключатель -f:

-f FILE, --file=FILE
    Obtain patterns from FILE, one per line.  The empty file contains zero patterns, and therefore matches nothing.

Экранирование не требуется внутри файла. Просто сделайте его файлом, содержащим одну строку (и, следовательно, один шаблон), которую можно создать из переменной оболочки, если это то, что вам нужно сделать.

# example trivial regex
var='^r[^{]*$'
pattern=/tmp/pattern.$$
rm -f "$pattern"
echo "$var" > "$pattern"
egrep -f "$pattern" /etc/password
rm -f "$pattern"

Просто чтобы проиллюстрировать это.

Попробуйте использовать -F вместо этого, как другой плакат, предложенный для защиты регулярных выражений.

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