2016-07-15 1 views
0

온라인 RegEx 테스트 도구에서 정규식 패턴을 실행하면 아래 텍스트가 정상적으로 작동합니다. 유닉스SED - 욕심이없는 정규식 캔트가 sed에서 작동하는 것 같습니다

에 나오지에서 사용하는 경우 그러나, 그것은 작동하지 않습니다

텍스트 :

정규식
<Field1><Field2><Field3>001</Field3></Field2><Field4><FieldDesc>Transaction Successful</FieldDesc></Field4><DtTm><LocalDtTm>2016-07-01-12:05:40.383</LocalDtTm></DtTm><Field5><Field6>N</Field6><Field7></Field7><DtTm><LocalDtTm>2016-07-01-12:05:44.171</LocalDtTm></DtTm></Field5></Field1> 

: Sed의에서

<DtTm>(.*?)<\/DtTm> 

사용법 : <DtTm></DtTm>

sed 's/<DtTm>(.*?)<\/DtTm>//g' 
사이에 아무것도를 제거하는보기

예상 출력 :

<Field1><Field2><Field3>001</Field3></Field2><Field4><FieldDesc>Transaction Successful</FieldDesc></Field4><Field5><Field6>N</Field6><Field7></Field7></Field5></Field1> 

답변

3

GNU sed에는 기본 모드와 확장 모드의 두 가지 모드가 있습니다. 이들 중 어느 것도, 덜 진보 된 단일 기본 모드 (sed 구현)도 욕심없는 사양을 허용하지 않습니다. info sed 출력에 따라 두 개 이상의 일치 동일한 문자부터 가능한 경우 정규식 정합 욕심 것을

주, 즉 일치은 최장 선택하고, 왼쪽에서 오른쪽으로 시도하고있다.

그래서, 당신은 필요이 아닌 욕심, 당신은 당신이 언급 한 온라인 테스트 도구를 사용하여 무엇 아마입니다 펄 (또는 뭔가 다른 PCRE 지원), 같은 다른 도구를 선택해야한다면 .

좋은 점은 Perl 대용 명령은 프로그램 이름을 자주 바꿀 수 있고 복잡한 RE에서 다른 구분 문자를 사용할 수 있으므로 sed과 매우 흡사합니다. 그래서 톱니 모양으로 끝나지 않게됩니다. \/\/\/\/\/) :

perl -pe 's|<DtTm>.*?</DtTm>||g' 
+1

효과가있었습니다. perl -pe 's/. *? <\/DtTm> // g ' –

관련 문제