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

Я относительно новичок в 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" 

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

  • Как отлаживать / проверять файл `--exclude-from` для` tar`?
  • Можно ли сопоставить несколько конкретных номеров строк (не диапазон) с sed?
  • Как совместить точную строку с помощью `sed`? Но не его часть.
  • Почему tar --exclude = ". *" Создает пустой архив?
  • Использование подстановочных знаков для соответствия директории в bash
  • Bash для соответствия каталогам, имена которых начинаются с точки (периода), будучи «явным», вместо использования «shopt -s dotglob»?
  • Совпадение всех шаблонов из файла сразу
  • Как удалить все подкаталоги из каталога?
  • BASH: количество слов в каждой строке документа
  • Почему символ дикой карты * настолько отличается между командами zip и rm?
  • Подстановочные знаки: как я могу перечислить файлы, заканчивающиеся на `.txt`, только без использования символа точки?
  • Linux и Unix - лучшая ОС в мире.