Количественно определить захваченное регулярное выражение

Я ищу пути к файлам в скриптах. Итак, я собираюсь написать сценарий, который выводит файл, а затем ищет "/".

Я бы предпочел использовать регулярные выражения Perl и просто хотел бы найти пути к файлам.

foo@foohost:~ $ cat /sbcimp/dyn/data/FOO/GSD/scripts/FOOonoff.pl | grep "/"

#!/usr/bin/perl
my $output_file = "/sbcimp/dyn/data/stmFOO3/dailymetrics/PartRates/file6.csv";
my $input_file_name_ESTATE = "/sbcimp/dyn/sym/data/stmFOO3/part_rates/FOO_estate.$year$month1$day1.1630.csv";
my $input_file_name_ESTATE = "/sbcimp/data/stmFOO3/part_rates/FOO_estate.20140829.1630.csv";
my $input_file_name_ESTATE2 = "/sbcimp/part_rates/FOO_estate.$year$month1$day2.1630.csv";
my $input_file_name_ESTATE3 = "/sbcimp/FOO_estate.$year$month2$day3.1630.csv";
my $input_file_name_NEW = "/sbcimp/dyn/data/stmFOO3/dailymetrics/RiskTiers/new_terms.csv";
    $argVal =~ s/\s+$//;
    $argVal =~ s/^\s+//;
    $argVal =~ s/\"$//;
    $argVal =~ s/^\"//;
    $argVal =~ s/\'$//;
    $argVal =~ s/^\'//;

Если я перехватываю файл и пропускаю его через perl one liner, я получаю только корневой каталог.

foo@foohost:~ $ cat /sbcimp/dyn/data/FOO/GSD/scripts/FOOonoff.pl | perl -nle 'print /(\/\w+\/)/' | sort -u

/sbcimp/

Я понимаю квантификаторы в регулярных выражениях, но если я использую 'print /(/\w+/){1,9}/', это не даст мне "/w+/..e либо 1 или 9 раз. Я буду искать для путей, которые 1 или много раз превышают корневой путь. Как определить количество всего захваченного регулярного выражения, а не только последний символ?

1 ответ

Я рекомендую не использовать регулярное выражение для разбора кода Perl, а вместо этого использовать PPI,

Следующее анализирует строки Perl, предоставленные вами для строк, сводит их к базовому содержимому, а затем извлекает информацию о пути:

use strict;
use warnings;

use PPI;
use File::Basename;

my $src = do {local $/; <DATA>};

# Load a document
my $doc = PPI::Document->new( \$src );

# Find all the strings within the doc
my $strings = $doc->find( 'PPI::Token::Quote' );
for (@$strings) {
    my $str = eval 'no strict; no warnings; '. $_->content;
    next if $@ || $str !~ /\//;

    my ($name, $path) = fileparse($str);

    print "$path\n";
}

__DATA__
#!/usr/bin/perl
my $output_file = "/sbcimp/dyn/data/stmFOO3/dailymetrics/PartRates/file6.csv";
my $input_file_name_ESTATE = "/sbcimp/dyn/sym/data/stmFOO3/part_rates/FOO_estate.$year$month1$day1.1630.csv";
my $input_file_name_ESTATE = "/sbcimp/data/stmFOO3/part_rates/FOO_estate.20140829.1630.csv";
my $input_file_name_ESTATE2 = "/sbcimp/part_rates/FOO_estate.$year$month1$day2.1630.csv";
my $input_file_name_ESTATE3 = "/sbcimp/FOO_estate.$year$month2$day3.1630.csv";
my $input_file_name_NEW = "/sbcimp/dyn/data/stmFOO3/dailymetrics/RiskTiers/new_terms.csv";
    $argVal =~ s/\s+$//;
    $argVal =~ s/^\s+//;
    $argVal =~ s/\"$//;
    $argVal =~ s/^\"//;
    $argVal =~ s/\'$//;
    $argVal =~ s/^\'//;

Выходы:

/sbcimp/dyn/data/stmFOO3/dailymetrics/PartRates/
/sbcimp/dyn/sym/data/stmFOO3/part_rates/
/sbcimp/data/stmFOO3/part_rates/
/sbcimp/part_rates/
/sbcimp/
/sbcimp/dyn/data/stmFOO3/dailymetrics/RiskTiers/
Другие вопросы по тегам