2011-04-23 6 views
1

나는 여러 파일에서 반복되는 코드의 다음과 같은 부분이 있습니다 검색 및 여러 파일에 걸쳐 정규 표현식을 대체 (대형 데이터)

<tr> 
    <th scope="row"> (some php code) </th> 
    <td> 
     (more php and html) 
    </td> 
</tr> 

일부 공백이있을 수 있습니다를 전/TR, 일 또는 TD 태그 후.

나는 다음으로 대체하기 위해 사용된다 어떤 도구 및 정규식 :

<div class="row"> 
    $1 
    $2 
</div> 

감사합니다.

+0

/검색/구문 분석 HTML이나 XML을 대체하는 정규 표현식을 사용하지 마십시오. – blueberryfields

+0

@blueberryfields - 그건 유효한 우려이며, 나는 아래에 그것에 대해 논평했다. 그러나,이 특별한 경우에 나는 정규식을 사용하는 것이 수용 가능하다고 말하고 싶다. 필자는 본질적으로 3 개의 간단한 검색/교체 작업을 많은 수의 파일에서 수행 할 수있는 빠른 방법을 원한다고 생각한다. 이 경우에는 중첩이 없었습니다. –

+0

질문에 해당 효과에 대한 메모를 추가 할 수 있습니다 (예 : "일반적으로 나쁜 생각이지만,이 사용은 허용되는 예외입니다."). 이것은 개발자들에게 엄청난 공통적 인 함정이므로 낭비되는 시간이 길어 다른 사람들이 그것에 빠지지 않도록해야 할 가치가 있습니다. – blueberryfields

답변

3

Perl은 전체를 메모리로 읽을 수 있도록 명령 줄 옵션이 -0777입니다. 이 작업을 완료하면 공백으로 \s*을 사용하는 대체를 사용할 수 있으며 줄 바꿈 경계를 넘습니다. .을 사용하는 경우 대체 끝에 /s을 사용해야합니다.

난 정말 당신이 일치 원하는 것을 말할 수는 없지만, 일반적인 원칙은 다음과 같습니다 ∞ 시간 동안

perl -0777 -i.orig -pe 's/foo/bar/gs' file1 file2 file3 
4

을, HTML을 구문 분석 정규식을 사용하지 마십시오. HTML 파서를 사용하십시오.

perl에서는 Web::Scraper과 같은 모듈을 사용한다는 의미입니다.

+0

저는 특별한 경륜의 시대가 있습니다. :) – tchrist

+0

이것은 일회성 이었기 때문에 가능한 가장 짧은 해결책을 찾고있었습니다. 그렇지 않으면 나는 정규식으로 그것을하지 않았을 것이다 :) –

1

이렇게 할 수 있습니다. awk도 마찬가지입니다. 먼저 레코드 구분 기호를 </tr>으로 설정 한 다음 검색 문자열 인 시작 태그 <tr>을 찾습니다. 검색 문자열이 '더 많은 html 코드'라고 가정 해 보겠습니다.

v="my new string" 
awk -vRS="</tr>" -v newstring="$v" '/<tr>/ && /more html code/{ $0=newstring}{print $0>FILENAME}' file 

당신 허용 대답과 유사한 펄에 대한 또 다른 대안,

ruby -0777 -i.orig -pe 's/foo/bar/gs' file1 file2 file3 
관련 문제