Я пытаюсь выполнить динамический поиск и заменить Perl в командной строке, причем часть заменяемого текста является результатом команды grep в обратных тактах. Можно ли это сделать в командной строке, или мне нужно написать сценарий для этого?Динамический Perl найти и заменить с помощью grep внутри backticks
Вот такая команда, которую я думал бы сделать трюк. Я думал, что Perl будет относиться к кавычке как подстановки команд, но вместо этого он просто обрабатывает кавычку и содержимое в них в виде строки:
perl -p -i -e 's/example.xml/http:\/\/exampleURL.net\/`grep -ril "example_needle" *`\/example\/path/g' `grep -ril "example_needle" *`
UPDATE:
Спасибо за полезные ответы. Да, в моем оригинальном однострочном шрифте была опечатка: целевой файл grep должен быть *.
Я написал небольшой сценарий, основанный на примере Schewrn, но у меня запутанные результаты. Вот сценарий я написал:
#!/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 встречается только один раз в каждом файле, поэтому его следует сопоставлять только один раз и заменять один раз. Это связано с неправильным использованием функции поиска?
Если я не ошибаюсь, 'Grep -ril«example_needle»' не хватает целевого файла, так как вы не можете напечатать имя файла на стандартный ввод. Возможно, вам стоит просто попытаться объяснить, что вы пытаетесь сделать. – TLP
найдите время, чтобы создать небольшой файл образца, который вы можете редактировать в своем вопросе, и показать, что вам нужно в качестве вывода. В противном случае мы просто догадываемся. Удачи. – shellter
Иск определенно не нужен, поскольку позиция дескриптора файла уже будет в начале при открытии файла. Что касается вашего описания проблемы, вы обнаружите, что 1 пример стоит более 10 эссе. Я предполагаю, что вы хотите, например, открыть 'foo/bar.html', заменить'/example/example.xml' на 'http: // examplesite.net/some/path/foo/example/example.xml'? – TLP