28

Я написал себе program программы Линукс , которая нуждается в регулярное выражение в качестве входных данных.

Я хочу вызвать программу в оболочке bash и передать это регулярное выражение в качестве аргумента командной строки программе (есть и другие аргументы командной строки). Типичное регулярное выражение выглядит как

[abc]\_[x|y]

К сожалению, символы [ , ] и | специальные символы в bash . Таким образом, призывая

program [abc]\_[x|y] anotheragument

не работает Есть ли способ передать выражение с помощью каких-либо escape-символов или кавычек и т.д.?

(Вызов program "[abc]\_[x|y] anotheragument" не работает, поскольку он интерпретирует два аргумента как один.)

8 ответов8

24

Используйте одинарные кавычки. Одинарные кавычки гарантируют, что ни один из символов не будет интерпретирован.

$ printf %s 'spaces  are  not  interpreted away
neither are new lines
nor variable names $TESTING
nor square brackets [TESTING]
nor pipe characters or redirection symbols | > <
nor the semicolon ;
nor backslashes \a \b \c \\
the only thing that does not work is the single quote itself
'

Есть два решения, если вам нужно вставить одну цитату:

$ printf '%s\n' '[ Don'"'"'t worry, be happy! ]'
[ Don't worry, be happy! ]
$ printf '%s\n' '[ Don'\''t worry, be happy! ]'
[ Don't worry, be happy! ]
24

Вы также можете

  1. Избегайте каждого отдельного специального символа с обратной косой чертой (как в \[abc\]_\[x\|y\]) или
  2. Двойной кавычки весь аргумент (как в "[abc]_[x|y]").

РЕДАКТИРОВАТЬ: Как некоторые уже указывали, dobleqouting не предотвращает расширение переменных или подстановку команд. Поэтому, если ваше регулярное выражение содержит что-то, что bash может интерпретировать как одно из них, используйте вместо этого одинарные кавычки .

6

На man bash

Существует три механизма цитирования: escape-символ, одинарные и двойные кавычки.

Обратная косая черта без кавычек (\) является escape-символом. Он сохраняет буквальное значение следующего символа, за исключением <newline>. Если появляется пара \ <newline> и обратная косая черта сама по себе не заключена в кавычки, \ <newline> рассматривается как продолжение строки (то есть она удаляется из входного потока и фактически игнорируется).

Заключение символов в одинарные кавычки сохраняет буквальное значение каждого символа в кавычках. Одиночная кавычка может отсутствовать между одинарными кавычками, даже если ей предшествует обратная косая черта.

Заключение символов в двойные кавычки сохраняет буквальное значение всех символов в кавычках, за исключением $, `, \ и, когда расширение истории включено ,!, Символы $ и ` сохраняют свое особое значение в двойных кавычках. Обратная косая черта сохраняет свое специальное значение только тогда, когда за ней следует один из следующих символов: $, `, ", \ или <newline>. Двойная кавычка может быть заключена в двойные кавычки, если им предшествует обратная косая черта. Если включено, расширение истории будет выполняться, если только ! в двойных кавычках экранируется с помощью обратной косой черты. Обратная косая черта предшествует ! не удаляется.

Специальные параметры * и @ имеют особое значение в двойных кавычках (см. ПАРАМЕТРЫ ниже).

Слова вида $ ' string ' обрабатываются специально. Слово расширяется до строки, символы с обратной косой чертой заменяются в соответствии со стандартом ANSI C. Escape-последовательности с обратной косой чертой, если они есть, декодируются следующим образом:

       \ а оповещения (звонок) \ Ъ забой \ е \ Е маскирующим \ F форма подачи \ п новой строки \ возврата каретки г \ т горизонтальная табуляция \ v вертикальная табуляция \\ обратная косая \»апостроф  двойные кавычки \ NNN восьмибитный символ, значение которого является восьмеричным значением nnn (от одной до трех цифр) \ x HH восьмибитный символ, значение которого является шестнадцатеричным значением HH (одна или две шестнадцатеричные цифры) \ u HHHH Unicode (ISO/IEC 10646) символ, значение которого шестнадцатеричное значение HHHH (от одного до четырех шестнадцатеричных цифр) \ U HHHHHHHH (10646 ИСО / МЭК) символ Юникода, значение которого шестнадцатеричное значение HHHHHHHH (от одного до восьми шестнадцатеричных цифр) \ с X A управления- х символов

Расширенный результат заключен в одинарные кавычки, как если бы знак доллара отсутствовал.

Строка в двойных кавычках, перед которой стоит знак доллара ($ " string "), приведет к переводу строки в соответствии с текущей локалью. Если текущим языковым стандартом является C или POSIX, знак доллара игнорируется. Если строка переведена и заменена, замена заменяется двойными кавычками.

2

Вы можете использовать обратную косую черту ( \ ) перед специальными символами, чтобы экранировать их следующим образом:

john@awesome:~ # echo \&
&
2

Хотя это может быть бесполезно в качестве регулярного выражения, некоторые последовательности символов могут интерпретироваться как имена переменных Bash. Чтобы предотвратить это и избежать их расширения, используйте одинарные кавычки вместо двойных кавычек:

program '[abc]_[x|y]' anotherargument

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

param_array=('[abc]_[x|y]' anotherargument)    # create an array
param_array+=(yetanother)     # append another element to the array
program "${param_array[@]}"   # use the array elements as arguments to program
1
program "[abc]_[x|y]"
program "[abc]_[x|y]" anotherargument
0

Откуда взялся этот паттерн? Это исправлено или от пользователя? Это пользователь, который вызывает скрипт в локальной системе, или кто-то удаленный?

Вы используете кавычки для переноса данных, чтобы оболочка не интерпретировала их. Есть два варианта:

  1. Двойные кавычки, которые все еще допускают некоторую интерпретацию ($ expand и `backticks`)
  2. Одиночные кавычки, которые пропускают все буквально

Поскольку $ является допустимым символом в регулярных выражениях (конец строки / буфер), вы, вероятно, захотите использовать одинарные кавычки для хранения регулярного выражения, если только вы не храните в переменной. Если вы берете произвольные данные от кого-то ненадежного, вам нужно заменить ' на '"'"' а затем заключить в одинарные кавычки.

Обратите внимание, что [abc]_[x|y] выглядит так, как будто вы хотите соответствовать x или y , в то время как на самом деле он соответствует одному из трех символов xy| , Квадратные скобки соответствуют символам внутри и только - для диапазонов и ^ в начале для отрицания. Таким образом, [abc]_(x|y) может быть тем, что вы имели в виду, а скобки - это символы, которые являются специальными для оболочки. Квадратные скобки не являются особенными для оболочки, это просто выглядит так, как они. Двойные квадратные скобки [[ ... ]] являются специальными.

0

Экранирование их должно работать нормально:

  programm \[abc\]_\[x\|y\]

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .