Освобожденные регулярные выражения

Регулярные выражения являются мощным механизмом для обработки текста. Можно использовать регулярные выражения, чтобы искать образец в блоке текста, заменить биты того текста с другими битами текста и управлять строками различными другими тонкими и интересными способами.

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

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

Вы будете видеть эти команды, используемые всюду по этой главе.

В целях этой главы необходимо вставить следующие строки текста в текстовый файл с окончаниями строки UNIX (новая строка):

Mary had a little lamb,
its fleece was white as snow,
and everywhere that Mary went,
the lamb was sure to go.
A few more lines to confuse things:
Marylamb had a little.
This is a test.  This is only a test.
Mary was married.  A lamb was nearby.
Mary, a little lamb, and my grocer's freezer...
Mary a lamb.
Marry a lamb.
Mary had a lamb looked like a lamb.
I want chocolate for Valentine's day.
This line contains a slash (/).
This line contains a backslash (\).
This line contains brackets ([]).
Why is mary lowercase?
What about Mary, Mary, and Mary?
const people fox
constant turtles bear
constellation Libra
How about 9 * 9?
The quick brown fox jumped over the lazy dog.

Сохраните это в вызванный файл poem.txt.

Где я могу использовать регулярные выражения?

Регулярные выражения обычно используются для текстовой фильтрации. Например, для изменения каждого возникновения буквы "a" в строке к капиталу "A", Вы могли бы повторить строку и передать результат по каналу к sed как это:

echo "This is a test, this is only a test" | sed 's/a/A/g'

Можно также использовать регулярные выражения для поиска строк в файле или блоке текста при помощи grep команда. Например, для поиска слова "bar" в файле foo.txt, Вы могли бы сделать это:

grep "bar" foo.txt
# or
cat foo.txt | grep "bar"

Наконец, при случае, может быть полезно использовать регулярные выражения в, проверяют утверждения. Это усовершенствованное использование описано далее в Использовании Регулярных выражений в, Проверяют Утверждения.

Типы регулярных выражений

Существует три основных типа регулярных выражений: основные регулярные выражения, расширенные регулярные выражения и регулярные выражения Perl. Всюду по этой главе разделы указывают на области, в которых они отличаются. Этот раздел является просто сводкой различий. Для большего количества подробности посмотрите надлежащий раздел.

Основные регулярные выражения и расширенные регулярные выражения отличаются по следующим областям:

Регулярные выражения Perl эквивалентны расширенным регулярным выражениям с несколькими дополнительными функциями:

Синтаксис регулярного выражения

Фундаментальный формат для регулярных выражений является одним из следующего, в зависимости от того, что Вы пытаетесь сделать:

/search_pattern/modifiers
command/search_pattern/modifiers
command/search_pattern/replacement/modifiers

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

Второй синтаксис используется для большинства команд. В этой форме некоторая работа происходит на строках, соответствующих образец. Это может быть формой соответствия, или оно может включить удаление частей строки, соответствующих образец.

Третий синтаксис используется для команд замены. Они могут считаться более сложной формой поиска и замены.

Например, следующая команда ищет слово 'тест' в указанном файле:

# Expression: /test/
grep 'test' poem.txt

Доступность команд и флагов варьируется несколько между вариантами регулярного выражения и описана в соответствующих разделах.

Позиционные привязки и флаги

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

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

Например:

# Expression: /^Mary/
grep "^Mary" < poem.txt

Это соответствует слово «Mary», но только когда это появляется в начале строки. Точно так же следующие соответствия слово «лиса», но только в конце строки:

# Expression: /fox$/
grep "fox$" < poem.txt

Другой общий метод для изменения поведения при сравнении регулярного выражения с помощью флагов. Эти флаги, когда помещено в конце регулярного выражения, могут измениться, позволяют ли регулярному выражению соответствовать через многократные строки, является ли соответствие чувствительными к регистру или нечувствительными, и различными другими аспектами соответствия.

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

Например:

# Expression: s/Mary/Joe/
sed "s/Mary/Joe/" < poem.txt

Это заменяет только первое возникновение «Мэри» с «Джо». Путем добавления глобального флага к выражению это вместо этого заменяет каждое возникновение, как показано в следующем примере:

# Expression s/Mary/Joe/g
sed "s/Mary/Joe/g" < poem.txt

Подстановочные знаки и операторы повторения

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

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

# Expression: /wa./
grep 'wa.' poem.txt

Это соответствует строки, содержащие, и «было» и «хочет», потому что точка может соответствовать любой символ.

Подстановочные знаки обычно объединяются с операторами повторения для соответствия строк, в которых известна только часть содержания. Например, Вы могли бы хотеть искать каждую строку, содержащую «Мэри» со словом «ягненок», кажущийся позже. Вы могли бы указать выражение как это:

# Expression: /Mary.*lamb/
grep "Mary.*lamb" poem.txt

Это ищет Мэри, сопровождаемую нулем или большим количеством символов, сопровождаемых ягненком.

Конечно, Вы, вероятно, хотите, чтобы по крайней мере один символ между теми избежал соответствий для строк, содержащих «Marylamb». Наиболее распространенный способ решить это с плюс (+) оператор. Однако можно создать это выражение несколькими способами:

# Expression (Basic): /Mary.\+lamb/
# Expression (Extended): /Mary.+lamb/
# Expression: /Mary..*lamb/
grep "Mary.\+lamb" poem.txt
grep -E "Mary.+lamb" poem.txt    # extended regexp
grep "Mary..*lamb" poem.txt

Первая точка в третьем выражении соответствует отдельный символ. Точечная звездочка впоследствии соответствует быть нулем или большим количеством дополнительных символов. Таким образом эти три оператора эквивалентны.

Заключительный полезный оператор повторения является оператором вопросительного знака (?). Этот оператор соответствует нуль или повторения того, что предшествует ему.

Например, если Вы хотите соответствовать и Мэри и Жениться, Вы могли бы использовать выражение как это:

# Expression (Basic): /Marr\?y/
# Expression (Extended): /Marr?y/
grep "Marr\?y" poem.txt
grep -E "Marr?y" poem.txt

Вопросительный знак заставляет предыдущий r быть дополнительным, и таким образом, это выражение строки соответствий, содержащие или «Мэри» или «Жениться».

Таким образом, основной подстановочный знак и операторы повторения:

Классы символов и группы

Поиск определенных ключевых слов может быть полезным, но это достаточно часто. Часто полезно искать присутствие или отсутствие ключевых символов в данной позиции в строке поиска.

Например, предположите, что Вы требуете, чтобы слова Мэри и ягненок были в том же предложении. Чтобы сделать это, необходимо только позволить определенным символам появляться между этими двумя словами. Это может быть достигнуто с помощью классов символов.

Существует два основных типа классов символов: предопределенные классы символов и пользовательские, или определяемые пользователем классы символов. Они описаны в следующих разделах.

Предопределенные классы символов

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

  • [:alnum:]— все алфавитно-цифровые символы (a-z, A-Z, и 0-9).

  • [:alpha:]— все буквенные символы (a-z, A-Z).

  • [:blank:]— весь пробел в строке (пробелы или вкладки).

  • [:cntrl:]— все управляющие символы (ASCII 0-31).

  • [:digit:]— все числа.

  • [:graph:]— все алфавитно-цифровые символы или знаки препинания.

  • [:lower:]— все строчные буквы (a-z).

  • [:print:]— все печатаемые символы (противоположность [:cntrl:], то же как объединение [:graph:] и [:space:]).

  • [:punct:]— все знаки препинания

  • [:space:]— все пробельные символы (пространство, вкладка, новая строка, возврат каретки, перевод формата и вертикальная вкладка). (См. примечание ниже о совместимости.)

  • [:upper:]— все прописные буквы.

  • [:xdigit:]— все шестнадцатеричные цифры (0-9, a-f, A-F).

Например, следующее является другим способом соответствовать любое предложение, содержащее Мэри и ягненка (но не, если существуют знаки препинания между ними):

# Expression: /Mary[[:alpha:][:digit:][:blank:]][[:alpha:][:digit:][:blank:]]*lamb/
grep 'Mary[[:alpha:][:digit:][:blank:]][[:alpha:][:digit:][:blank:]]*lamb' poem.txt

Пользовательские классы символов

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

Например, если Вы только хотите позволить пробелы и буквы, Вы могли бы создать класс символов как этот:

# Expression: /Mary[a-z A-Z]*lamb/
grep "Mary[a-z A-Z]*lamb" poem.txt

В этом примере существует два диапазона (‘a'через'z'и'A'через'Z’) позволенный, а также пробел. Таким образом любая буква или пространство соответствуют этот образец, но другие вещи (включая символ точки) не делают. Таким образом эта строка соответствует первую строку стихотворения, но не соответствует более позднюю строку, начинающуюся «с Мэри, был женат».

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

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

# /Mary[^.]*lamb/
grep "Mary[^.]*lamb" poem.txt

Группировка операторов

Как упомянуто ранее, регулярные выражения также имеют понятие группировки. Цель сгруппироваться состоит в том, чтобы обработать многократные символы как единственный объект, обычно в целях изменения того объекта с повторным оператором. Эта группировка сделана с помощью круглых скобок или заключенных в кавычки круглых скобок, в зависимости от используемого диалекта регулярного выражения.

Например, скажите, что Вы хотите искать любую строку, содержащую слово «Mary», сопровождаемое дополнительно словом, “имел", сопровождаемый Word «a». Вы могли бы записать это выражение как это:

#Expression (Basic): /Mary \(had \)\?a/
#Expression (Extended): /Mary (had )?a/
grep "Mary \(had \)\?a" poem.txt
grep -E "Mary (had )?a" poem.txt

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

#Expression (Basic): /\(Mary\|had\|lamb\)/
#Expression (Extended): /(Mary|had|lamb)/
grep '\(Mary\|had\|lamb\)' poem.txt
grep -E '(Mary|had|lamb)' poem.txt

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

Например, следующие строки дают тот же результат:

sed -E 's/(lamb|lamb,)/orange/' poem.txt
sed -E 's/(lamb,|lamb)/orange/' poem.txt

Однако, следующие строки не делают:

perl -pi.bak -e 's/(lamb|lamb,)/orange/' < poem.txt
perl -pi.bak -e 's/(lamb,|lamb)/orange/' < poem.txt

В Perl, когда ввод содержит слово «ягненок», сопровождаемый запятой, механизм регулярного выражения соответствует слову «ягненка» сначала, потому что это - крайняя левая опция. Это заменяет его «оранжевым» словом и оставляет запятую. Во второй опции, потому что версия с запятой соответствует сначала, удалена запятая, если это там.

Можно, конечно, также избежать этой проблемы путем записи выражения как:

perl -pi.bak -e 's/lamb,?/orange/' < poem.txt

Используя пустые подвыражения

Иногда, при работе с группами, можно счесть необходимым включать дополнительную группу. Может быть заманчиво записать такое выражение как это:

# Expression (Extended): /const(ant|ellation|) (.*)/

В нечетной причуде, однако, некоторые инструменты командной строки не ценят пустое подвыражение. Существует два способа решить это.

Самый простой путь состоит в том, чтобы сделать всю группу дополнительной как это:

# Expression (Extended): /const(ant|ellation)? (.*)/
grep -E 'const(ant|ellation)? (.*)'

Поочередно, пустое выражение может быть вставлено после вертикальной панели.

# Expression (Extended): /const(ant|ellation|()) (.*)/
grep -E "const(ant|ellation|()) (.*)" poem.txt

Заключение в кавычки специальных символов

Как замечено в предыдущих разделах, много символов имеют особое значение в регулярных выражениях. Например, классы символов окружаются квадратными скобками, и символы тире и символы вставки имеют особое значение. Вы могли бы спросить, как можно искать один из этих символов. Это - то, где входит заключение в кавычки.

В регулярных выражениях определенные символы небуквы могут иметь некоторое особое значение, в зависимости от контекста. Для обработки этих символов как обычного символа можно снабдить префиксом их символ наклонной черты влево (\). Это также означает, что символ наклонной черты влево является особенным в любом контексте, так для соответствия литерального символа наклонной черты влево, необходимо заключить его в кавычки со второй наклонной чертой влево.

Существует одно исключение, как бы то ни было. Чтобы заставить закрывающую квадратную скобку быть элементом класса символов, Вы не заключаете его в кавычки. Вместо этого Вы заставляете его быть первым символом в классе.

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

# Expression: /[]\\]/
grep '[]\\]' poem.txt

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

Как правило, по крайней мере в расширенных регулярных выражениях, любой неалфавитно-цифровой символ может безопасно быть заключен в кавычки, необходимо ли сделать так или нет. Если заключение в кавычки его не необходимо, дополнительная наклонная черта влево просто проигнорирована. Однако не всегда безопасно заключить в кавычки буквы или числа, поскольку они имеют особые значения на определенных диалектах регулярного выражения, как описано в Получении Операторов и Переменных и Расширений Python и Perl. Кроме того, заключение в кавычки круглых скобок может не сделать то, что Вы могли бы ожидать на некоторых диалектах, как описано в Получении Операторов и Переменных.

В основных регулярных выражениях поведение при заключении в кавычки символов кроме круглых скобок, изогнутых фигурных скобок, числа и символы в классе символов не определены.

Получение операторов и переменных

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

Получение операторов и переменных используется, чтобы взять части исходного входного текста, получить их при поиске, и затем заменить теми битами в середину текста замены.

Самый простой способ объяснить операторов получения и переменные на примере. Предположим, что Вы хотите подкачать слова, быстрые и ленивые в строке, «Быстрая коричневая лиса перепрыгнула через ленивую собаку». Вы могли бы записать выражение как это:

# Expression (Basic): s/The \(.*\) brown \(.*\) the \(.*\) dog/The \3 brown \2 the \1 dog/
# Expression (Extended): s/The (.*) brown (.*) the (.*) dog/The \3 brown \2 the \1 dog/

Когда Вы передаете эти выражения sed, последняя строка poem.txt должен стать «Ленивой коричневой лисой, перепрыгнул через быструю собаку».

# Expression (Basic): s/The (.*) brown (.*) the (.*) dog/The \3 brown \2 the \1 dog/
sed "s/The \(.*\) brown \(.*\) the \(.*\) dog/The \3 brown \2 the \1 dog/" < poem.txt
 
# Expression (Extended): s/The \(.*\) brown \(.*\) the \(.*\) dog/The \3 brown \2 the \1 dog/
sed -E "s/The (.*) brown (.*) the (.*) dog/The \3 brown \2 the \1 dog/" < poem.txt
 
# Perl supports extended form, but also supports
# using a dollar sign for the variable name.  (Note
# the use of single quotes to prevent the shell from
# doing variable substitution on $1, $2, and $3.)
perl -pi.bak -e "s/The (.*) brown (.*) the (.*) dog/The \3 brown \2 the \1 dog/" < poem.txt
perl -pi.bak -e 's/The (.*) brown (.*) the (.*) dog/The $3 brown $2 the $1 dog/' < poem.txt

Содержание между каждой парой круглых скобок (в этом случае — видят примечание) получено в его собственный буфер, пронумерованный последовательно. Таким образом, в этом выражении, содержание между и «коричневый» получено в буфер. Затем содержание между «коричневым» и полученного. Наконец, содержание между и «собака» получено.

В замещающей строке вставляются слова разделителя («коричневый», и «собака»), и содержание накопительных буферов вставляется в противоположный порядок.

Смесительное получение и группировка операторов

Так как круглые скобки служат и получающими и группирующимися операторами, использование группировки может привести к неожиданным последствиям при получении текста в том же выражении. Например, следующее выражение будет вести себя очень по-другому в зависимости от ввода:

# Expression /const(ant)? (.*)/

Текст, который Вы, вероятно, намеревались получить, находится во втором буфере, не первом.

Используя модификаторы

Полное поведение регулярного выражения может быть настроено с помощью многих модификаторов. Например:

/foo/i

В этом примере, /i модификатор заставляет регулярное выражение соответствовать нечувствительным к регистру способом. Таким образом это соответствует и «Фу» и «fOo».

Не все команды и языки поддерживают все модификаторы. Например, большинство версий sed поддержка команды только /g модификатор.

Основные модификаторы:

Perl и расширения Python

Диалект регулярного выражения, используемый в Perl, Python, и многих других языках, является дальнейшим расширением расширенных регулярных выражений. Некоторые существенные различия включают:

Можно найти ссылки к дополнительным ресурсам, описывающим эти расширения в Для получения дополнительной информации.

Ярлыки класса символов

Регулярные выражения Perl добавляют много дополнительных ярлыков класса символов. Некоторые из них упоминаются ниже:

  • \A— привязки, соответствующие к началу строки в целом (но не началу строк в строке).

    Этот ярлык широко не поддерживается за пределами Perl. На других языках использовать ^ и добавьте /s модификатор (или не указывают /m модификатор, завися) для указания соответствия строки сразу.

  • \b— граница слова (см. примечание).

  • \B— граница неслова (см. примечание).

  • \d— эквивалентный [: цифра:].

  • \D— эквивалентный [^:digit:].

  • \f— перевод формата.

  • \n— новая строка.

  • \p— символ, соответствующий следующее свойство символа Unicode. Например, \p{L} соответствует букву Unicode.

  • \P— символ не соответствие следующего свойства Unicode. Например, \P{L} соответствия любой символ Unicode, который не является буквой.

  • \r— возврат каретки.

  • \s— эквивалентный [: пространство:].

  • \S— эквивалентный [^:space:].

  • \t— вкладка.

  • \u— единственный символ Unicode в регулярных выражениях JavaScript. Этот ярлык должен сопровождаться четырьмя шестнадцатеричными цифрами.

  • \v— вертикальная вкладка.

  • \w— эквивалентный [: слово:].

  • \W— эквивалентный [^:word:].

  • \x— запустите кода символа ASCII (в шестнадцатеричном числе). Например, \x20 является пространством.

  • \X— единственный символ Unicode (не поддерживаемый универсально). Этот ярлык должен сопровождаться четырьмя шестнадцатеричными цифрами.

  • \z— привязки, соответствующие до конца строки в целом (но не конец строк в строке).

    Этот ярлык широко не поддерживается за пределами Perl. На других языках использовать $ и добавьте /s модификатор (или не указывают /m модификатор, завися) для указания соответствия строки сразу.

  • \Z— привязки, соответствующие до конца строки в целом (но не конец строк в строке). Если строка заканчивается разрывом строки, на некоторых языках (включая Perl), это соответствует до заключительного разрыва строки. Для предотвращения этого использовать \z вместо этого.

    Этот ярлык широко не поддерживается за пределами Perl. На других языках использовать $ и добавьте /s модификатор для указания соответствия строки сразу.

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

Нежадное подстановочное соответствие

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

Для поддержки этого регулярные выражения Perl (вместе со многими другими диалектами) поддерживают нежадное подстановочное соответствие. Для преобразования жадного повторного оператора в нежадного повторного оператора Вы просто добавляете вопросительный знак после него.

Например, полагайте, что детский стих “Мэри имел немного ягненка, его флис был белым как снег, и везде что Мэри пошла, ягненок, несомненно, пошел бы”. Предположите применение следующего выражения:

/Mary.*lamb/

То выражение соответствия “Мэри имели немного ягненка, его флис, было белым как снег, и везде что Мэри пошла, ягненок”.

Предположим, что вместо этого, Вы хотите найти самую короткую строку, начинающуюся с «Мэри» и заканчивающуюся «ягненком». Вы могли бы вместо этого использовать следующее выражение:

/Mary.*?lamb/

То выражение соответствует, только слова “Мэри имели немного ягненка”. +? оператор ведет себя так же.

Неполучение круглых скобок

Можно заметить, что синтаксис для получения идентичен синтаксису для группировки описанного в Операторах Повторения и Подстановочных знаках. В большинстве случаев дополнительные получения не являются проблемой. Если Вы используете круглые скобки просто в качестве инструмента группировки, Однако в некоторых случаях (особенно при разделении строк на массивы в Perl), можно хотеть избежать получать содержание.

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

Рассмотрите следующий пример:

# Expression (Perl and Similar ONLY): /Mary (?:had)* a little lamb\./
perl -pi.bak -e "s/Mary (?:had )*a little lamb\./Lovely day, isn't it?/" < poem.txt

Это выражение соответствует «Мэри», сопровождаемой нулем (0), или больше экземпляров следовало “небольшим ягненком”, следовало к литеральному периоду и заменяет незаконную строку (“Мэри, имел немного ягненка”.) с “Прекрасным днем, не так ли?”.

Для получения дополнительной информации

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

Для полного объяснения регулярных выражений Perl и дополнительных функций и причуд в различных языках программирования, посмотрите http://perldoc .perl.org/perlre.html и http://www .regular-expressions.info/.

Используя регулярные выражения в проверяют утверждения

Оболочка test команда (описанный в тестовой Нотации Команды и Скобки) исходно не поддерживает регулярные выражения, поэтому для использования регулярных выражений в, проверяют утверждения, необходимо использовать в своих интересах возможность выполнить произвольные внешние команды (более в частности, grep команда) вместо того, чтобы использовать нотацию скобки.

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

grep команда выходит с успешным статусом выхода (0) если ввод соответствует указанное выражение, по крайней мере, один раз или неработающий статус выхода (обычно 1) если не соответствует образец. Таким образом можно легко использовать его для управления if оператор.

Например:

if (echo "$MYVAR" | grep "bar" > /dev/null) ; then
    echo "The value of MYVAR ($MYVAR) contains \"bar\"."
fi

В вышеупомянутом примере, самый правый статус выхода (от grep) обрабатывается как статус выхода для группы команд (предполагающий, что echo команда успешно выполняется, который она всегда должна). Перенаправление к /dev/null препятствует тому, чтобы текстовый вывод был распечатан на экран пользователя.

Регулярные выражения могут также использоваться в другом проверять утверждения такой как while циклы. Например, следующий отрывок считает случаи буквы 'x' в однострочной строке:

MYVAR="xxxxxx"
while (echo "$MYVAR" | grep 'x' > /dev/null) ; do
    # Be sure to change MYVAR here!
    echo "got x"
    MYVAR="$(echo "$MYVAR" | sed -E 's/x//')"
done

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