Найти и регулярное выражение

Что я делаю неправильно с этим выражением находки?

; touch ook ooks ; find . -name 'ook' -or -name 'ooks' -type f ./ook ./ooks ; find . -name 'ook[s]?' -type f [returns nothing] ; echo $? 0 

  • SED изменяет только начало строки и сохраняет конец строки
  • Печать повторяющегося рисунка
  • Нечувствительный к регистру поиск в awk
  • Что значит . совпадение?
  • Почему некоторые команды регулярных выражений имеют противоположные интуиции '\' с различными символами?
  • perl regex заменяется глобально, если глобальный не выбран
  • Как заменить путь в поле поиска с помощью VIM
  • Как заменить этот шаблон на новую строку внутри?
  • 2 Solutions collect form web for “Найти и регулярное выражение”

    Вы смешиваете регулярные выражения с шаблонами поиска оболочки.

    ? в оболочке означает любой отдельный символ.

    ? в regexp означает, что предыдущий символ (или подзапись) является необязательным.

    Пытаться:

    find . -regex '.*ooks?' -type f

    На странице поиска:

            -regex pattern
                   Имя файла соответствует шаблону регулярного выражения.  Это совпадение
                   на весь путь, а не на поиск.  Например, чтобы сопоставить файл
                   с именем `./fubar3 ', вы можете использовать регулярное выражение`. * bar.'  или
                   `. * b. * 3 ', но не` f. * r3'.  Регулярные выражения понятны
                   по поискам по умолчанию Emacs Regular Expressions, но это может
                   изменить с помощью параметра -regextype.
    

    Этот ответ применяется, по крайней мере, к GNU find.

    -name совпадает с использованием шаблонов оболочки, если вы хотите выполнить сопоставление регулярных выражений, вместо этого используйте -regex :

      find . -regex '.*ook[s]?' -type f 

    -regex соответствует всему пути с использованием emacs regex. Тип регулярного выражения можно изменить с помощью параметра -regextype .

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