2013-05-23 3 views
2

vim을 사용하여 외부의을 모두 제거하려고 시도했습니다. <text> 블록입니다. 이것은 개행과 다른 (관련없는) 태그들에 걸쳐 있어야합니다.태그 외부 텍스트 삭제

정규식을 사용하여 텍스트를 개행 문자로 대체하려고 시도했지만 몇 가지 이유 중 하나가 실패했습니다. 그 중 하나는 내 시도가 여러 줄에 걸쳐 있지 않았기 때문에 내 성냥을 비 욕심 많게해야합니다. (어떻게 든 {-}를 사용하여 수행됩니다 그?)

I의 모습 삭제하고자하는 내용과 일치해야합니다 정규식 : <//text>.*<text.*>하지만이 경기가 아닌 욕심 할 경우, 나는 다른 문제가있을 수 있습니다. (나는 또한 내가이 일을 처음에 정리 한 부분 태그 섹션을해야합니다 알고 있습니다.)

내가 복용해야 또 다른 방법이 있는가, 또는 누군가는 사이하지 모든 컨텐츠 을 제거하기 위해 저를 인도 할 수 vim을 사용하여 태그?

편집 : 샘플 텍스트를 포함

<contributor> 
     <username>MalafayaBot</username> 
     <id>628</id> 
     </contributor> 
     <minor /> 
     <comment>Robô: A modificar Categoria:Vocábulo de étimo latino (Português) para Categoria:Entrada de étimo latino (Português)</comment> 
     <text xml:space="preserve">={{-pt-}}= 
==Substantivo== 
{{flex.pt|ms=excerto|mp=excertos}} 
{{paroxítona|ex|cer|to}} {{m}} 
# [[extrato]] de um [[texto]], [[fragmento]] 
#: ''A seguir, um '''excerto''' do texto original.'' 

===Tradução=== 
{{tradini}} 
* {{trad|es|extracto}} 
* {{trad|fr|extrait}} 
{{tradmeio}} 
* {{trad|en|excerpt}} 
{{tradfim}} 

=={{etimologia|pt}}== 
:Do latim ''[[excerptu]]'' (colhido de). 

=={{pronúncia|pt}}== 
===Brasil=== 
* [[SAMPA]]: /e.&quot;sEx.tu/ 
* [[AFI]]: /esˈertu/ 
[[zh:excerto]]</text> 
     <sha1>8i1zywj37s74ah4wnai11ohorfjn8j5</sha1> 
     <model>wikitext</model> 
+0

는 예를 들어 – Kent

+0

을 제공하십시오 당신이 당신의 파일에 하나의''블록을 수행 그것으로, 추출은만큼 쉽다? – Kent

+1

정규식은 정말이 도구가 아닙니다. 이것은 html을 구문 분석하기에 좋지 않은 이유에 대한 흥미로운 읽을 거리가 될 것입니다. http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags – FDinoff

답변

2

정규 표현식을 사용하는 것이 잘못된 도구를 사용하고 있음을 나타냅니다.

XML에서 텍스트를 추출하려면 XSLT를 사용할 수 있습니다. XSLT는 정규 표현식보다 훨씬 우수한 특수 사례를 처리합니다. 또는 xidel과 같은 특수 목적 도구를 사용하십시오. grep (XML 용)

xidel --extract "//text" input.xml 
+0

나는 당신이 옳다고 믿습니다. XSLT가이를 더 잘 처리 할 것입니다. 남자, 나는 XSL을 사용하여 싫어. 어쨌든, 나는이 대답을 받아 들일 것이다. – BlackVegetable

1

당신이 정력에 필요하지 않은 경우, 당신은 당신의 파일의 이름으로 "테스트"대체이 나오지 명령을 사용하여 시도 할 수 있습니다. -i 옵션이 전달 실제 파일을 수정 나오지도 알려줍니다 때문에 내가 먼저 파일의 복사본이를 테스트 할

sed -i 's/<\/text>[^<]*/<\/text>/g' test 

편집 :. 샘플을보고 난 후에, 나는 다른 접근 방식을거야. .. 태그 안의 모든 텍스트를 없애는 대신 .. 모든 블록을 선택하고 새 파일로 출력 할 것입니다. 다행히 당신의 grep 버전은 -P 옵션을 지원합니다. 시도해보십시오.

grep -Pzo "(?s)<text.*?<\/text>" sample.txt > out.txt 
+0

흠, 그건 효과가없는 것 같습니다. 그게 아무것도 제거하지 못했습니다 *. 그것은 실행하는 데 시간이 좀 걸렸어. (이 파일의 길이는 9 백만 라인입니다.) – BlackVegetable

+0

내가 이런 모습을 사용하고 있었다 샘플 테스트 파일 :' loijefr ' 또는 같은 최종 텍스트입니다 afrer aeeawre afefawefa efaerfe eaee ljlijef? – dshu610

+0

텍스트 태그에도 내용이 있습니다. ' blahblahblah'와 같이. – BlackVegetable

0

파일에 <text> 블록이 하나만 있다고 가정합니다. vim에서이 줄은 샘플 텍스트에 적용됩니다.

%s#\_.*\(<text.\{-}>\_.*</text>\)\_.*#\1# 
+0

슬프게도 수천 개가 있습니다. – BlackVegetable