모든 파일의 일부 ASP 코드를 PHP 코드로 변경

모든 파일의 일부 ASP 코드를 PHP 코드로 변경

매우 간단한 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올바르게 인식됩니다.

노트

이것은 분명히 모든 라인에서 모든 패턴을 찾아야 하기 때문에 가장 효율적인 접근 방식은 아닙니다. 그래도 모든 것을 수동으로 회피하는 것보다 작동하고 훨씬 간단합니다.

이름에 새 줄이 포함된 파일의 경우 스크립트가 실패합니다. 여기서는 문제가 되지 않을 것 같아요.

관련 정보