2012-06-19 3 views
0

Я хотел бы искать в папку для всех файлов заканчиваются на .m для строки, как @ «LBL_18989» @ «LBL_15459», @ «LBL_14359» ...Linux командной строки регулярное выражение

Моя команда:

find . type f -name \*.m | grep '@"LBL_[[0-9]"]+' 

, но он не работает :(

+1

@ F.J. - редактирование сообщения для исправления ошибки с его кодом вызывает путаницу. – jordanm

+0

Исходная команда find: 'find. type f -name * .m | grep '@ "LBL _ [[0-9]"] +' '. Это не позволит мне изменить сообщение, потому что удаление «\» не является заменой 6 символов. – jordanm

+1

Вы пытаетесь grep для имен файлов с этим строковым шаблоном или файлами, содержащими текстовые данные с этим шаблоном? – jdi

ответ

3

Вы всегда должны процитировать ваши аргументы. Ваш -name шаблон для находки содержит «*», что означает, что оболочка будет пытаться расширить его как Глобо перед передачей его find. Вы также можете использовать -regex вместо того, чтобы прокладывать вывод find в grep.

find . -type f -regex '@"LBL_[[:digit:]"]+' 

На основании комментария jdi вам может потребоваться выполнить поиск содержимого этих файлов для данного регулярного выражения. Если это так, вы можете использовать следующее:

find . type f -name '*.m' -exec grep -E '@"LBL_[[:digit:]"]+' /dev/null {} + 
+0

Я на самом деле просто набрал эту правку как ответ сам. Вы также можете записать его как: '-exec grep -H -E '@" LBL _ [[: digit:] "] +' {} \;' – jdi

+0

@jdi - Да, как я обычно использую, но ' -H' не POSIX, и вопрос отмечен OSX. – jordanm

+0

Я сейчас на OSX-боксе. Работает отлично для меня, независимо от того, – jdi

0

Ваш код работает для меня. Однако регулярное выражение, указанное в вопросе, будет намного больше, чем просто имена файлов в списке примеров. Это может быть проблемой, если вы хотите проверить, нужны ли имена файлов для проверки имени, потому что некоторые из них подтвердят, что это действительно не должно. Ваш шаблон

Grep регулярное выражение '@ "LBL _ [[0-9]"] +'

также соответствует имена файлов, такие как

  1. @ "LBL_"
  2. @ "LBL_2"
  3. @ "LBL_3" 3"
  4. @ "LBL_" 4

Если список действительно предст ив я бы вместо этого использовать

Grep «@„LBL _ [[0-9]] +“»

и переместить символ кавычки, чтобы после того, как плюс, в конце картины. Вы можете использовать grep и, возможно, это ваш прецедент, но если вы используете egrep или grep с ключом -E, вы можете использовать класс [[: digit:]]. POSIX.2 хмурится на диапазонах в выражении скобки, используя символ тире. Из спецификации POSIX: «Диапазоны очень зависимы друг от друга, а переносные программы должны избегать полагаться на них».

Смежные вопросы