Intereting Posts
Менеджер разделов, который может работать с LVM? Как настроить яркость в Fedora 17 на Sony Vaio Установка Debian говорит: «CD_ROM, похоже, не содержит действительного« Release »файла» при установке с usb Backporting OpenSSL-1.0.1e для Debian Lenny (armv4l) Как я могу просмотреть ссылку или чит-лист базового синтаксиса bash в терминале linux? Wi-Fi перестает работать в режиме ожидания Повторяются ли повторяющиеся записи в переменной PATH с приоритетом, заданным первой записью? Сохранять виды в нескольких терминалах экрана Как установить NTP-сервер, который уязвим для NTP-усиления Как связать файл журнала и сохранить его, когда последний из них изменит дату? apt-get не работает на kali linux v2.0 Fedora 26 на USB-накопителе обновил ядро ​​4.11.8 до 4.11.9 больше не загружается Контейнер LXC не может получить доступ к локальной сети или Интернету Как получить IP-адрес устройства, открытый в сети простым способом? Как восстановить пароль пользователя linux?

Почему нет? регулярный символ создает совпадение в sed?

У меня есть строка, похожая на ../../sdd1 и пытаюсь ../../sdd1 здесь sdd . Я пытаюсь использовать следующую команду sed :

 echo "../../sdd1" | sed 's:.*\([az]\{3\}\)[0-9]?:\1:' 

и это не приводит к совпадению.
Но когда я использую

 echo "../../sdd1" | sed 's:.*\([az]\{3\}\)[0-9]\{0,1\}:\1:' 

то я получаю свой матч, sdd .

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

Итак, вопрос в том, почему [0-9]? regex не соответствует 1 из sdd1 , или почему нам нужно избегать ? и фигурные скобки?

По умолчанию sed использует BRE и для использования ERE потребуется -E или -r

Цитата из руководства GNU sed

В GNU sed единственное различие между основными и расширенными регулярными выражениями заключается в поведении нескольких специальных символов: «?», «+», Круглых скобок, фигурных скобок («{}») и «|».

С базовым (BRE) синтаксисом эти символы не имеют специального значения, если только префикс обратной косой черты ('\'); В то время как с расширенным (ERE) синтаксисом он обращается вспять: эти символы являются специальными, если они не имеют префикса обратной косой черты ('\').

поэтому для GNU sed используйте

 $ echo '../../sdd1' | sed 's:.*\([az]\{3\}\)[0-9]\?:\1:' sdd $ echo '../../sdd1' | sed -E 's:.*([az]{3})[0-9]?:\1:' sdd 

для POSIX BRE ваша вторая команда – это путь

 $ echo '../../sdd1' | sed 's:.*\([az]\{3\}\)[0-9]\{0,1\}:\1:' sdd