매우 간단한 ASP 코드가 포함된 파일 디렉터리를 PHP 서버로 마이그레이션하고 찾기 및 바꾸기 메커니즘을 사용하여 모든 파일의 내용을 수정해야 합니다. 저는 정규식을 잘 사용하지 못하지만 이를 사용하여 몇 가지 사항을 변경했습니다.
find . -name "*.php" -print0 | xargs -0 -n 1 sed -i -e 's/oldstring/newstring/g'
교체해야 할 복잡한 문자열이 있습니다. 아래를 참조하세요:
에서:
<% if request("page") = "" then %>
도착하다:
<?php if(!isset($_GET['page']) || !$_GET['page']){ ?>
이 *는 임의의 숫자일 수 있으며 *가 있는 "TO"에 해당 숫자를 유지합니다.
에서:
<% elseif request("page") = "*" then %>
도착하다:
<?php } elseif($_GET['page'] == '*'){ ?>
마지막은 매우 간단합니다. 에서:
<% end if %>
도착하다:
<?php } ?>
디렉터리에서 이 작업을 반복적으로 일괄 실행할 수 있다면 이 파일에 있는 ASP 코드의 98%가 수정됩니다. 다양한 방법으로 이러한 문자열을 이스케이프 처리해 보았지만 작동시키는 방법을 알 수 없습니다. 도움을 주시면 감사하겠습니다!
답변1
이를 수행하는 방법은 여러 가지가 있습니다. Perl을 활용하는 것이 좋습니다.quotemeta
기능.
먼저,탭으로 구분됨첫 번째 열의 검색 패턴과 두 번째 열의 대체 항목을 포함하는 텍스트 파일:
$ cat pats.txt
<% if request("page") = "" then %> <?php if(!isset($_GET['page']) || !$_GET['page']){ ?>
<% elseif request("page") = "*" then %> <?php } elseif($_GET['page'] == '*'){ ?>
<% end if %> <?php } ?>
내용이 다음과 같은 테스트 파일을 만들었습니다.
$ cat foo.asp
<% if request("page") = "" then %>
<% elseif request("page") = "*" then %>
<% end if %>
Perl이 구조에 옵니다:
find . -name "*.php" | while IFS= read -r file; do
perl -i.bak -e 'open(A,"pats.txt");
while(<A>){chomp; @a=split(/\t/); $k{quotemeta($a[0])}=$a[1]}
while(<>){
foreach $pat (keys(%k)){
s/$pat/$k{$pat}/;
}
print}' $file;
done
Perl의 플래그는 선택적 백업 접미사를 지정할 수 있는 -i
곳과 동일하게 작동합니다 . sed
위의 예에서는 foo.php.bak
처리된 각 파일에 대해 이름이 지정된 파일이 생성됩니다. -i
백업이 필요하지 않은 경우 단독으로 사용하세요.
설명하다:
스크립트는 패턴과 대체 항목을 읽고 %k
대체 항목이 값인 키의 해시( )로 패턴을 저장합니다. 이 quotemeta
함수는 ASCII가 아닌(일치하지 않는 [A-Za-z_0-9]
) 문자를 모두 이스케이프합니다.
해당 스크립트는 두 번째 파일을 열고 각 줄의 각 패턴을 찾아 그에 따라 바꿉니다. 검색 패턴이 이스케이프되었으므로 quotemeta
올바르게 인식됩니다.
노트
이것은 분명히 모든 라인에서 모든 패턴을 찾아야 하기 때문에 가장 효율적인 접근 방식은 아닙니다. 그래도 모든 것을 수동으로 회피하는 것보다 작동하고 훨씬 간단합니다.
이름에 새 줄이 포함된 파일의 경우 스크립트가 실패합니다. 여기서는 문제가 되지 않을 것 같아요.