Совпадение шаблона оболочки и появление регулярных выражений

Я относительно новичок в Unix, и я наткнулся на одно любопытство. Некоторые конструкции оболочки, такие как case или find , используют сопоставление шаблонов, но это не совсем регулярное выражение. Другие команды, такие как ed , sed , vi и awk используют регулярные выражения для сопоставления шаблонов. Может ли кто-нибудь указать, какие команды оболочки (встроенные, программы) используют регулярное выражение и которые используют другой тип соответствия шаблонов?

2 Solutions collect form web for “Совпадение шаблона оболочки и появление регулярных выражений”

case использует globs , что является очень простой системой сопоставления шаблонов, аналогичной регулярным выражениям. Некоторые инструменты, такие как find , фактически поддерживают оба (через -name и -regex в этом случае). Но дело еще сложнее: есть разные вкусы регулярных выражений . Некоторые инструменты поддерживают один, несколько. Вам просто нужно проверить на комбинацию инструментов и версий то, что говорит справочная страница или другая справочная документация (и даже тогда это может быть трудно понять). Список ссылок был бы гигантским, и я не думаю, что это был бы очень полезный ответ.

Я думаю, что основное различие между использованием регулярного выражения заключается в том, требуется ли им согласовать всю строку или нет. В case , find и некоторые другие команды bash, вы должны соответствовать всей строке, в то время как в sed , awk , grep и т. Д. Вы должны соответствовать любой части строки. Кроме того, они похожи, но, конечно, не идентичны.

Например, когда вы используете регулярное выражение в операторах case bash, предполагается, что ваше регулярное выражение описывает всю строку. Т.е. (я использую пример здесь )

 case $SERVER in db-[0-9]+\.host\.com) echo "DB server" ;; *)echo "Unknown server" ;; esac 

Вы можете видеть, что db- [0-9] +. Host.com описывает строку, которая начинается с «db-», затем имеет одну или несколько цифр, а затем заканчивается на «.host.com», поэтому db-1 .host.com будет соответствовать, в то время как xdb-1.host.com не будет.

Теперь, если вы посмотрите на sed и напишите шаблон поиска аналогичным образом

 echo "xdb-1.host.com"| sed -nr '/db-[0-9]+\.host\.com/p' 

sed , в отличие от команды case , напечатает строку xdb-1.host.com, потому что она может найти шаблон поиска INSIDE этой строки. Таким образом, идея состоит не в том, чтобы соответствовать всей строке, а в том, чтобы найти какое-либо происхождение шаблона.

Аналогичным образом, если вы используете regexp в команде find , вся строка должна соответствовать. Например,

 find / -regextype sed -regex ".*\.dat" 

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

 find / | sed -nr '/.*\.dat/' 

он будет соответствовать всем файлам, которые содержат строку «.dat» в имени файла.

Конечно же, есть некоторые незначительные различия в синтаксисе. Например, если вы это сделаете

 find / -name "*.dat" 

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

  • Как найти файлы, заканчивающиеся на ~ и pyc?
  • Помощник Scrabble в bash
  • Как отлаживать / проверять файл `--exclude-from` для` tar`?
  • ! (*. sh) работает в командной строке, но не в скрипте
  • Найти файлы, которые заканчиваются номером
  • Подстановочные знаки: как я могу перечислить файлы, заканчивающиеся на `.txt`, только без использования символа точки?
  • Почему grep обрабатывает строку ebug 'по-разному?
  • Исправление соответствия шаблонов для сценария оболочки
  • Почему символ дикой карты * настолько отличается между командами zip и rm?
  • wget рекурсивный с файлами без расширения
  • grep -f сбой в файле, отредактированном в Windows
  • Interesting Posts

    Как я могу заставить `cacafire` отображаться в исходном терминале gnome вместо отдельного окна?

    Как добавить событие мыши в Gnome Shell?

    Как удалить строку, только если она указана в указанном номере строки и соответствует шаблону?

    Запустите правило udev для флэш-накопителя USB, когда компьютер запущен с вставленным устройством

    установленный шрифт не работает в ec2 в приложении rails

    Что делают эти команды?

    (CentOS) по умолчанию FTP (SFTP) Файл журнала?

    Как я могу найти, какой драйвер модуля имеет адрес i2c?

    Помогите с распаковкой .dd.gz, возможно, поврежденной

    Как установить драйверы в Linux

    Вставка с vim сжимает содержимое между предыдущим контентом и маржей

    В bash я могу асинхронно открывать сокеты и использовать их позже?

    Загрузить Linux bzImage в QEMU?

    Как сделать резервную копию через rsync на удаленном компьютере, сохраняя разрешения и права собственности?

    Почему экспорт не влияет на дочерние оболочки?

    Linux и Unix - лучшая ОС в мире.