Количественно определить захваченное регулярное выражение
Я ищу пути к файлам в скриптах. Итак, я собираюсь написать сценарий, который выводит файл, а затем ищет "/".
Я бы предпочел использовать регулярные выражения 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/