2012-03-22 4 views
0

그래서 결국 sed와 반대되는 목적으로 내 상사에게 perl 사용을 승인하게되었습니다.Perl 욕심이없는 정규식

다음은 기본적인 사고 방식입니다.

는이 같은 라인이 : 그것은 정말 지저분입니다

<div class="SectionText">Sometext</div><div class="SectionText">Some more text</div> 

을,하지만 난 그것을 기록하지 않았다. 어느 쪽이든,이 같은 페이지 생긴 수있다 그리고 그들은이 형식으로 변경해야합니다

<p>Sometext</p><p>Some more text</p> 

은 분명히이 아닌 욕심 필요가있다.

perl -nle "s/(.*)<div class=\"SectionText\">(.*?)<\/div>(.*)/\1<p>\2<\/p>\3/ig; print $1" "somefile.html" > otherfile.html 

그러나,이 아무것도 안하고 SectionText 모든 태그가 남아 : 지금 여기에 내가이 돕기 위해 마련 한 라인입니다.

+0

당신은 욕심이 없으면서도 정규 표현식의 처음과 중간과 끝에'. * '을 넣어야한다고 말합니다. 또한 실제 HTML 구문 분석기를 사용하지 않으시겠습니까? –

답변

6

정규 표현식이 HTML 처리에 이상적이라는 점에 유의하십시오. 적절한 방법은 파서를 사용하고 DOM을 조작하는 것입니다.하지만 간단하고 올바르게 작동하는 상황에서 정규 표현식을 사용하면 문제를 해결할 수 있습니다. 이 점이 설계의 약점이며 예기치 않은 문제를 일으킬 수 있다는 점을 경계하십시오.

편집 할 영역 외부의 텍스트를 캡처하고 복원 할 필요가 없습니다. <div> 요소를 동일한 내용의 <p> 요소로 바꾸기 만하면됩니다. 다른 구분 기호를 선택하는 한 큰 따옴표 나 슬래시를 이스케이프 할 필요가 없습니다.

교체 문자열에 \1, \2 등을 사용하는 것은 잘못된 것입니다. $1, $2 등이 여기에 속하므로 명령 줄에 -w을 사용했다면이 경고 메시지가 표시됩니다. 당신이

perl -pe 's|<div class="SectionText">(.*?)</div>|<p>$1</p>|ig' somefile.html > otherfile.html 
+0

감사! 이것은 잘 작동합니다! –

4

출력 방법에 대한 HTML::TreeBuilder::XPathHTML::Element를 참조하십시오

이 작동합니다.

my $t = HTML::TreeBuilder::XPath 
    ->new_from_content('<div class="SectionText">Sometext</div><div class="SectionText">Some more text</div>'); 
for ($t->findnodes('//div[@class="SectionText"]')) { 
    $_->tag('p'); 
    $_->attr(class => undef); 
} 

가 100 % 정확 만들려면, class 속성 값이 공백에 분할해야 클래스 이름 SectionText 제거하고 속성 값은 재 조립. 나는 위의 코드 에서처럼 class 속성을 삭제하는 것으로 벗어날 수 있다고 생각합니다.

관련 문제