ZaLinux.ru

Как использовать кавычки в регулярных выражениях grep

Как использовать одинарные и двойные кавычки в Bash

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

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

К примеру, следующий код в PHP:

echo "21 ' \" 0";

завершится без ошибок и выведет: 21 ' " 0

С функцией echo мы поместили строку в двойные кавычки, в них мы не экранировали одинарную кавычку ('), но экранировали двойную кавычку (\").

Если обернуть строку в одинарные кавычки, то нужно будет экранировать в ней одинарные, но не нужно экранировать двойные кавычки:

echo '21 \' " 0';

Если эти же функции выполнить в Bash, то первая из них сработает нормально:

echo "21 ' \" 0";

А второй вариант работать не будет:

echo '21 \' " 0';

Важное следствие: в Bash невозможно использовать экранированные одинарные кавычки внутри одинарных кавычек. В Bash в строке можно использовать одинарные кавычки только внутри двойных кавычек.

Примыкание строк в Bash

В Bash не нужно указывать специальные символы (как, например, точку в PHP или знак плюс в JavaScript) для конкатенации (объединения) строк. Две строки, расположенные вместе, считаются объединёнными.

К примеру, я хочу с помощью команды echo вывести следующую строку:

test'quote1"quote2

То есть в этой строке кавычки двух типов.

Если я попробую экранировать одинарную кавычку и помещу строку в одинарные кавычки:

echo 'test\'quote1"quote2'

то у меня ничего не получится.

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

echo "test'quote1\"quote2"

Но можно обойтись вовсе без экранизации кавычек! Для этого часть строки с одинарной кавычкой помещаем в двойные кавычки (получается "test'quote1") а часть строки с двойной кавычкой помещаем в одинарные кавычки (получается '"quote2'). А затем собираем обе части вместе, проста ставя их в команде рядом друг с другом:

echo "test'quote1"'"quote2'

Как использовать кавычки в регулярном выражении grep

Кавычки в регулярных выражениях команды grep нужно использовать по рассмотренным выше правилам:

  • регулярное выражение с буквальной одинарной кавычкой нужно помещать в двойные кавычки, а регулярное выражение с буквальной двойной кавычкой нужно помещать в одинарные кавычки
  • экранировать кавычки внутри регулярного выражения не надо

Как использовать сразу обе кавычки в регулярном выражении grep

Предположим, нужно найти строку по регулярному выражению сразу с двумя кавычками, например, такому: test1'test2"

В этом случае достаточно разбить выражение на две части, каждую часть поместить в противоположные кавычки (в этом примере это будет "test1'" и 'test2"'), а затем просто записать обе части рядом, например:

grep "test1'"'test2"' search-test.txt
test1'test2"

Это не единственный способ, при указании опции -P (--perl-regexp), вместо кавычек можно указывать экранированные последовательности символов \047 и \042.

  • \047 означает одинарную кавычку
  • \042 означает двойную кавычку

Плюс такого подхода в том, что регулярное выражение становится более читаемым за счёт уменьшения количества кавычек и экранирующих символов, а также можно использовать эти обозначения в классе символов […], когда по смыслу регулярного выражения должна быть ИЛИ одинарная кавычка, ИЛИ двойная кавычка, например:

grep -Pri 'bindkey [\047\042]\^r' ~/.oh-my-zsh/plugins

Также рекомендуются статьи:

Рекомендуемые статьи:

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *