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

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

Пример:

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

в оболочке, которая была довольно простой, что-то вроде

grep "mytext" * | cut -d ':' -f1 | Uniq

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

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

Thankss

Ответы [ 2 ]

3 голосов
/ 24 февраля 2012

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

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

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

1 голос
/ 24 февраля 2012
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 выше

...