Получить имя скрипта, выполненного в консоли linux при использовании perl regexp - PullRequest
0 голосов
/ 20 февраля 2012

Я хотел бы получить текст в файлах, используя регулярное выражение perl, и я делаю это

find ./ -name *.php -print | xargs perl -nle '/standard/ and print $0'

Как я обнаружил (используя google) в $ 0 должно быть имя исполняемого скрипта, но оно содержит "-e". Как я могу получить исполняемый скрипт?

Ответы [ 3 ]

5 голосов
/ 20 февраля 2012

Программисты заменяют длинные командные строки find / grep на ack .Он использует регулярные выражения Perl, которые являются более продвинутыми, чем GNU grep с -P (PCRE) или какой-либо предполагаемой реализацией регулярного выражения POSIX grep.

ack --php -l '(?<!\$)standard'
  • Автоматически рекурсивно.
  • Автоматически исключает управление версиями и ненужные файлы.
  • Полная мощность Perl.
  • Псевдонимы для общих расширений файлов вместо шаблонов оболочки.
  • Параметры командной строки, в значительной степени совместимые с grep, в примере -l печатает только совпадающие имена файлов.
2 голосов
/ 20 февраля 2012

Я предполагаю, что вы хотите напечатать имя файла. Если это так, используйте $ARGV.

perl -nle '/standard/ and print $ARGV'

С perldoc -v '$ARGV'

$ARGV   contains the name of the current file when reading from <>.

Переключатель -n делает именно это, он ставит цикл while(<>) вокруг программы.

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

perl -nle 'if (/standard/) { print $ARGV; close ARGV; }'
2 голосов
/ 20 февраля 2012

Вы хотите перечислить все php-файлы, которые содержат строку standard?Если это так, я бы использовал grep -r:

grep -r -l 'standard' . | grep '\.php$'

Как указано в моем комментарии к вашему вопросу, имя сценария отсутствует, поскольку вы не выполняете файл сценария.Предполагая, что вы хотите напечатать имя файла, которое передается в xargs / perl, используйте $ARGV[0], чтобы получить первый позиционный параметр для вызова perl (xargs автоматически добавляет его в командную строку). Вместо этого см. Ответ TLP

Вы также должны использовать find -print0 | xargs -0 для правильной обработки файлов с символами новой строки.


Расширение фрагмента grep: также возможно использовать grep внутри новой оболочки после фильтрациис помощью команды find:

find . -name '*.php' -print0 | \
  xargs -0 -L1 sh -c 'grep -l "pattern" "$1"' -

xarsg -L1, чтобы передать только одно имя файла в новую оболочку.grep -l "$1" чтобы напечатать имя файла и прекратить поиск после первого совпадения.- в качестве первого параметра для sh необходимо, чтобы $1 работал.


Еще одно редактирование ...

Я думал, что это сложно.Последняя команда может быть легко упрощена до:

find . -name '*.php' -print0 | xargs -0 grep -l "pattern"

Это, конечно, не так легко расширить, как версия sh -c, которая может делать практически все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...