2014-09-22 3 views
0

에 외삽 나는비 욕심 텍스트 매칭과 bash는

내가 펄에서 유틸리티를 작성했습니다
<mytag name="value" name="value"../> 

와 같은 큰 XML 태그 내에 속성을 구문 분석 할 수있는 유틸리티를 가지고있다. 그것은 다음과 같이 기본이 아닌 욕심 텍스트 매칭을 사용

while(<XML>) 
{ 
    if (/name=\"(.+?)\"/) 
    { 
     print("Value is: $1\n"); 
    } 

내가 추출 할 이름/값 쌍의 이름을 알고, 그래서 유틸리티로 하드 코드.
이것은 꽤 잘 작동합니다 ... 어떻게하면 bash에서이 작업을 수행 할 수 있습니까? awk을 사용해 보았지만 name="value with spaces in the middle"과 같은 속성이있는 경우에는 작동하지 않습니다.
awk를 사용하면 추출하고자하는 이름/값 쌍의 색인을 알아야합니다. 예를 들어 awk { print $3 }을 세 번째 집합으로 사용해야합니다. 값이 중간에 공백이 없더라도 제대로 작동하지만 실패하면 공백 문자까지만 실패합니다.

아무 것도 도움이 될 것입니다. 감사합니다.

+2

XML 구문 분석기를 사용하여 XML을 구문 분석하는 것이 좋습니다. –

+0

사실. 'xmlstarlet pyx'의 출력물을 파싱했다면 XML을 전통적인 텍스트 관리 도구로 쉽게 파싱 할 수 있도록 만들어진 라인 지향 형식으로 변환하기 때문에 올바르게 처리하는 것이 훨씬 쉽습니다. –

답변

1

간단히 말해서 욕심이 많지 않은 일치 (sed, awkgrep과 같은 많은 표준 유틸리티에서 사용할 수없는)를 사용하는 것을 피하는 것은 매우 쉽습니다. 예를 들어

는 (비 욕심 경기 포함) "일반"표현 : 그것은 가능하지만

name=\"(.+?)\" 

정확히 일반 정규 표현식

name=\"([^"]+)\" 

과 동일 무엇을 당신 진짜로 원하는 것입니다 :

name=\"([^"]*)\" 

내부 반복의 종료가 너무 쉽지는 않습니다. 패턴은 단일 문자가 아니지만 항상 작동하는 정규식이 있습니다. 예를 들어, C 스타일의 의견은 아닌 욕심 일치로 인식 될 수있다 :

/[*].*?[*]/ 

읽을 수 있지만 잘 작동합니다 조금 어렵 정규 표현식

/[*][^*]*[*]+([^*/][^*]*[*]+)*/ 

. (나는 [*]에서 \*까지 선호하지만 둘 다 똑같은 일을합니다.)