動的検索を実行し、コマンド ラインで 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 は各ファイルで 1 回しか発生しないことがわかっているため、これは奇妙です。これはシーク機能の誤用によるものでしょうか?