Как получить имя файла, если в файле Perl присутствует конкретное регулярное выражение
В каталоге, содержащем много файлов, если в файле найдено определенное регулярное выражение (или формат), получите это имя файла
Пример:
- если слово "rama" найдено в файле с именем ramayana, выведите имя файла "ramayana"
- если файл содержит конкретный формат, например, "(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 выше