Как использовать одинарные и двойные кавычки в 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
Также рекомендуются статьи:
- Регулярные выражения и команда grep
- Команда grep: опции, регулярные выражения и примеры использования
- Как обработать каждую строку, полученную от команды grep
- Подстановочные символы, раскрытие, использование кавычек и экранирование символов в Bash
- Как найти все файлы, содержащие определённый текст (на Linux)
Связанные статьи:
- Как использовать grep для поиска по стандартному выводу ошибок (stderr) (79.4%)
- Команда grep: опции, регулярные выражения и примеры использования (76.8%)
- Как обработать каждую строку, полученную от команды grep (63%)
- Лучшие терминальные мультиплексные инструменты (52.7%)
- Как присвоить переменной вывод команды в Bash (52.7%)
- Инструкция по использованию команды htop для интерактивного просмотра процессов в Linux (RANDOM - 50%)