동적 검색을 수행하고 대체 텍스트의 일부가 백틱 내에서 grep 명령의 출력이되도록 명령 줄에서 Perl로 바꾸려고합니다. 명령 줄에서이 작업을 수행 할 수 있습니까? 아니면이 작업을 수행하는 스크립트를 작성해야합니까?Dynamic Perl은 백틱 내에서 grep을 사용하여 찾아서 바꿉니다.
여기 트릭을 수행 할 것으로 생각되는 명령이 있습니다. 펄이 명령 치환과 역 따옴표를 치료하는 것이라고 생각하지만, 대신 그냥 역 따옴표와 문자열로 그 안에 콘텐츠를 취급 :
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는 각 파일에서 한 번만 발생하므로 한 번만 일치하고 한 번만 대체해야한다는 것을 알고 있기 때문입니다. 이것은 탐색 기능의 오용으로 인한 것입니까?
을,'GREP은 표준 입력에 파일 이름을 인쇄 할 수있는 "example_needle"-ril', 대상 파일을 부족합니다. 아마도 당신은 단지 당신이 무엇을하려고 하는지를 설명하려고 노력해야합니다. – TLP
시간을내어 질문으로 편집 할 수있는 작은 샘플 파일을 만들고 출력으로 필요한 것을 보여줍니다. 그렇지 않으면, 우리는 단지 짐작하고 있습니다. 행운을 빕니다. – shellter
파일을 열 때 파일 핸들 위치가 이미 처음에 있으므로 찾기가 불필요합니다. 문제 설명에 관해서, 당신은 1 개의 예가 10 가지 이상의 에세이에 가치가 있다는 것을 알게 될 것입니다. 예를 들어'foo/bar.html'을 열고'/ example/example.xml'을'http : // examplesite.net/some/path/foo/example/example.xml'으로 바꾸고 싶다고 가정합니다. – TLP