Чому регулярний вираз не дає результатів?


2

Команда

find . -maxdepth 1 -regextype posix-egrep -regex '.*/[a-z0-9\-\_\.]+\.(gz|deb)/' -exec echo {} \;

не дає результатів для каталогу, що містить такі файли:

  1. google-chrome-stable_current_i386.deb
  2. rkhunter-1.4.2.tar.gz

хоча при тестуванні регулярного виразу [a-z0-9\-\_\.]+\.(gz|deb)на сайтах, таких як RegExr , він відповідає цим іменам.

Чому результат findне повертає ніяких результатів?


Чи є у вас поточний файл у вашому поточному каталозі? Не могли б ви показати їх імена?
MariusMatutiae

Навіщо використовувати -exec echo {} \;? Ось для чого -print.
Скотт

@Scott - Причина в тому, що я буду підставляти її такою командою, якmv
Мотивовано

@MariusMatutiae - Дякую і так, в каталозі є файли. Зразок їх надано на посаді.
Мотивовано

Відповіді:


2

Дві причини:

  1. Ви закінчили ваш рядок з регулярними виразками /. Імена файлів не закінчуються /.
  2. Мабуть, RegExr має помилку: щоб включити буквальний тире ( -) у виразі дужки регулярного виразу, він повинен бути першим символом, безпосередньо після [ (або після початкового ^, якщо такий є), або останнім символом, безпосередньо перед символом ]. Вам заборонено приклеювати його посередині, навіть не \перед собою.

Але також:

  1. ^, -, [І ]є тільки окремими символами , які є особливими в вираженні регулярного виразу кронштейна; вам не потрібно бігти .- і взагалі немає причини втекти _.

Отже, ваш регекс міг / повинен бути .*/[-a-z0-9_.]+\.(gz|deb).


Дякую, я не знав, що -його потрібно було визначити на початку або в кінці виразу. Чи .дотримується той же передумова?
Мотивовано

Зовсім навпаки - всередині [... ], А .це просто звичайний характер, як букви або цифри (або !, @, #і т.д. ..., і навіть $і *) і можуть з'являтися в будь-якому місці, без необхідності екранувати. Я залишив це в кінці виразного дужка, тому що саме там ви його мали. Так .*/[a-z0-9_.-]+\.(gz|deb)би також працювало.
G-Man
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.