grep을 사용하여 작동하는 Perl 정규 표현식이 있습니다. 나는 그것이 어떻게 작동하는지 이해하려고 노력하고 있습니다.
다음은 명령 명령입니다.
grep -oP '(?<=location>)[^<]+' testFile1.xml
다음은 내용이다testFile1.xml
<con:location>C:/test/file1.txt</con:location></con:dataFile>/con:dataFiles></con:groupFile>
이것이 결과다
C:/test/file1.txt
정규식을 이해하려고 노력 중입니다. 즉, 이 부분(?<=location>)[^<]+
답변1
(?<=...)
는뒤를 봐PCRE 연산자. 그 자체로는 아무것도 일치하지 않지만 오히려 조건으로 작동합니다(왼쪽에 있는 것이 무엇이든 일치 ...
).
(?<=X)Y
일치 Y
전제는 왼쪽의 내용이 일치한다는 것입니다 X
. in 은 blahYfooXYbar
두 번째 것과 일치하며 Y
일치 X
되는 항목의 일부가 아닙니다. 그 자체 (?<=X)
는 너비가 0인 것과 같습니다(상상의) 그 직전에요 Y
. 예는 다음과 같습니다.
$ echo X-RAY THE FOX | perl -lpe 's/(?<=X)/<there>/g'
X<there>-RAY THE FOX<there>
를 사용할 때는 -o
인쇄 grep
만 하기 때문에일치섹션에 무언가를 인쇄하는 한 가지 방법이 있습니다.뒤쪽에( location>
여기서 일치하는 것은 [^>]+
하나 이상의 ( +
) <
문자가 아닌 ( )이므로 다음 문자 또는 줄 끝 (비어 있지 않은 경우) [^>]
까지의 모든 것입니다 .<
또 다른 방법은 \K
(최신 버전의 PCRE에서) 다음을 사용하여 일치하는 부분의 시작을 재설정하는 것입니다.
grep -Po 'location>\K[^>]+'
-P
및 은 -o
GNU 확장입니다. pcregrep
최신 버전(8.11 이상)(다른 PCRE 구현 사용) 의 경우 grep
다음을 수행할 수도 있습니다.
pcregrep -o1 'location>([^>]+)'
( 처음-o1
캡처한 내용을 인쇄합니다(여기서는 하나만))(...)