Я пытаюсь выполнить динамический поиск и заменить на Perl в командной строке, причем часть текста замены является выводом команды grep в обратных галочках.Это можно сделать в командной строке, или мне нужно написать сценарий для этого?
Вот команда, которая, как я думал, сработает.Я думал, что Perl будет рассматривать обратные пометки как подстановку команд, но вместо этого он просто обрабатывает обратные помехи и содержимое внутри них как строку:
perl -p -i -e 's/example.xml/http:\/\/exampleURL.net\/`grep -ril "example_needle" *`\/example\/path/g' `grep -ril "example_needle" *`
ОБНОВЛЕНИЕ:
Спасибо за полезнуюответы.Да, в моей оригинальной однострочной опечатке была опечатка: предполагается, что целевой файл grep *.
Я написал небольшой скрипт на основе примера Шеврна, но у меня непонятные результаты.Вот сценарий, который я написал:
#!/usr/bin/env perl -p -i
my $URL_First = "http://examplesite.net/some/path/";
my $URL_Last = "/example/example.xml";
my @files = `grep -ril $URL_Last .`;
chomp @files;
foreach my $val (@files) {
@dir_names = split('/',$val);
if(@dir_names[1] ne $0) {
my $url = $URL_First . @dir_names[1] . $URL_Last;
open INPUT, "+<$val" or die $!;
seek INPUT,0,0;
while(<INPUT>) {
$_ =~ s{\Q$URL_Last}{$url}g;
print INPUT $_;
}
close INPUT;
}
}
В основном я пытаюсь сделать следующее:
- Найти файлы, содержащие $ URL_Last.
- Заменить $ URL_Lastс $ URL_First плюс имя каталога, в котором находится соответствующий файл, плюс $ URL_Last.
- Запишите вышеуказанное изменение во входной файл, не изменяя ничего во входном файле.
После запуска моего скрипта он полностью исказил код HTML во входном файле и обрезал первые несколько символов каждой строки в файле.Это странно, потому что я точно знаю, что $ URL_Last встречается в каждом файле только один раз, поэтому его следует сопоставлять только один раз и заменять один раз.Это вызвано неправильным использованием функции поиска?