我正在尝试在命令行上进行动态搜索并替换为 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 的目标文件应该是 *.
我根据 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 在每个文件中只出现一次,所以它应该只匹配一次并替换一次。这是由于滥用搜索功能引起的吗?