2014-06-21 2 views
0

내 문제는 이것이다 : 내가 다음 명령을 사용하여 여러 스크립트 (<?<php?에) 모든 태그를 변경하려고 :변경 PHP 태그

find . -name "*.php" -type f -print0 | xargs -0 sed -i -e 's/<? /<?php /g' 

문제는 그 나는 레이블 등이있는 경우 이 <?echo'Ble bla..';은이를 무시하고 변경되지 않습니다. 나도 좋습니다.

+0

는 앙드레 먼저 @, 나는이 대답을하고 있었다. 그런데'* .php'로 끝나고' hek2mgl

+0

@ hek2mgl 저자의 문제입니다. 수정 된 파일을 빠르게 살펴보고 그러한 구문이 있는지 확인해 볼 수는 있습니다.하지만이 내용에 대해서는 언급하지 않았으므로 게시했습니다. 어쨌든 당신은 더 나은 대답을 올렸습니다. :) –

+2

@ André이 코드를 추가 한 경우이를 바꿀 수 있지만 이미 user3680708

답변

1
다음과 같은 나오지도 명령을 사용할 수 있습니다

:

find -type f -name "*.php" -exec sed -i ':a;N;$!ba;s/<?\([ \n]\|echo\)/<?php \1/g' {} \; 

그것은 공백이나 줄 바꿈 또는 <? 후 용어 echo 중 하나와 일치됩니다 다음은 <?php<match_found>


참고로 대체 당신 돈 xargs 전화가 필요하지 않습니다. find-exec 옵션을 사용하면됩니다. 또한 -e 옵션을 sed으로 지정하는 것은 단일 표현식을 사용하는 한 필요하지 않습니다. 또한 -type 기준은 -name 옵션 이전이어야합니다. 그렇지 않으면 find는 경고를 던집니다.

+0

위대한 작품이지만 구문을 이해하지 못해, 고마워요! – user3680708

+1

약간의 고급 sed 사용법입니다. 기본적으로' '을''으로 바꿀 수 있도록 두 줄의 라인 버퍼로 작업하고 있습니다. 나머지 부분은 이전과 거의 동일하지만 sed의 기본 regulare 표현식이 필요하기 때문에 \를 사용하여 대부분의 메타 문자를 이스케이프 처리합니다. – hek2mgl

+0

검색 유형 f-name "* php"가 여전히 작동합니다. - Exec sed-i 's/\ ([\ n] \ | echo \)/ user3680708

0

당신은 PHP와 함께 할 항상 수 :

#!/usr/bin/php 
<?php 

foreach (glob("./*.php") as $fn) { 
    $data = file_get_contents($fn); 
    $data = preg_replace("/<\?php/", "<?", $data); 
    $data = preg_replace("/<\?[\b\n\s]*/", "<?php ", $data); 

    file_put_contents("./$fn", $data); 
} 
+0

PHP로 속임수를 고맙습니다. 이런 종류의 일을하고 싶지 않습니다. 하지만 당신에게 친구 감사합니다! – user3680708