Как получить имя файла, если в файле Perl присутствует конкретное регулярное выражение

В каталоге, содержащем много файлов, если в файле найдено определенное регулярное выражение (или формат), получите это имя файла

Пример:

  1. если слово "rama" найдено в файле с именем ramayana, выведите имя файла "ramayana"
  2. если файл содержит конкретный формат, например, "(TEXT - NUMBERS)" в имени файла с именем table, выведите эту таблицу имени файла

в оболочке это было довольно легко, что-то вроде

grep "mytext" * | cut -d':' -f1 | уник

но как это сделать в perl

Предложите мне, если какой-либо конкретный модуль CPAN помогает для этого

Thankss

2 ответа

Решение

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

perl -nlwe 'if (/mytext/) { print $ARGV; close ARGV }' *

-n открывать файлы и читать контент. -l добавить новую строку для печати (для удобства). И если текст найден, мы закрываем дескриптор файла, чтобы избежать печати нескольких совпадений. Он будет открыт снова, если будет обработано больше файлов.

perl -ne 'END { print join("\n", sort keys %found)} if (/PATTERNTOMATCH/) {$found{$ARGV[0]}=1;}' *

Моя первая попытка была:

perl -ne 'if (/PATTERNTOMATCH/) {print "$ARGV[0]\n";}' *

но это напечатало бы многократные имена файла, если это соответствует больше чем один раз в файле. Чтобы перестать показывать дубли, я попытался использовать "последний", чтобы выйти из неявного цикла, но, похоже, это не сработало. Таким образом, верхний пример помещает имя файла в хеш всякий раз, когда он находит совпадение (если (/PATTERNTOMATCH...), а затем в блок END (который находится в начале!), Он печатает ключи из хэша (чтобы удалить повторяющиеся имена файлов).

Боюсь, это немного ужасно. Я бы придерживался модуля CPAN, упомянутого DavidO выше

Другие вопросы по тегам