grep을 사용하여 정적 역참조를 얻을 수 있습니까?

grep을 사용하여 정적 역참조를 얻을 수 있습니까?

여러 행에서 그룹을 두 번 일치시키려고 합니다.

grep -Pz 'Source: (?<group>.*/).*\n.*\n.*\n.*\k<group>|$'

한 가지 주요 문제를 제외하고는 작동합니다. 즉, 그룹 일치의 첫 번째 발생과 동일한 문자를 \k<group>검색 하지 않고 검색하지 않습니다. 이는 역참조가 동적이라는 점을 고려하면 정상적인 현상입니다..*/

"정적" 역참조를 얻을 수 있습니까? 즉, (?<test>\d\d)45가 일치하면 그룹 테스트에 대한 다음 호출은언제나45를 찾고 계십니까?

나는 영어로 기술적인 용어를 잘 설명하지 못하기 때문에, 나에게 소리를 지르거나 좀 더 구체적으로 말하라고 해주세요.

(저는 여기서 Perl grep을 사용하고 있지만 이를 사용하지 않는 솔루션이 있다면 계속 진행하세요)

편집하다:

아래 의견에 답변하려면: 1: ex if 데이터를 기반으로 많은 수의 이미지 파일을 일괄 이동하는 스크립트가 있습니다. 완벽하게 작동하지만 경우에 따라 소스 디렉터리가 출력 디렉터리와 동일한지 테스트하고 싶습니다.

작업 예: [1/1] (TEST - no files are being moved/copied)
Source: /disk/media/Camera/IMG_20130611_183722.jpg
Date/Time: 2013-06-11 16:37:23
Corresponding Tags: Composite:GPSDateTime
Destination (move): ./2013/06-Jun/20130611_163723.IMG_20130611_183722.jpg

여기의 입력과 출력은 동일하지 않으므로 스크립트가 아무것도 감지하지 않기를 원하지만 만약

Source: /disk/media/Camera/IMG_20130611_183722.jpg

이동

Destination (move): /disk/media/Camera/20130611_163723.IMG_20130611_183722.jpg

저는 이 네 줄을 강조하고 싶습니다. 목적은 다른 목적으로 데이터를 검색하는 것이 아니라 탐지된 파일을 신속하고 시각적으로 식별하는 것입니다.

정규식을 사용하면 그룹의 두 번째 발생이 동적이기 때문에 항상 강조 표시됩니다(둘이 동일하지 않다는 것을 grep하는 것은 중요하지 않습니다).

답변1

알았어, 알 것 같아. 정규식 은 그룹의 맨 위에서 마지막 줄 이후까지 모든 것을 Source: (?<group>.*/).*\n캡처합니다 . group예를 들어 JPEG 이미지 파일 이름을 캡처하려면 캡처가 필요합니다.Source: //disk/media/Camera/

Source: .*/(?<group>.*)\n…

좋아, 다시 해보자. 나는 당신을 신뢰합니다원하는 정적 역참조를 얻으세요. 문제는 당신이 얻는다고 생각하는 역참조를 얻지 못한다는 것입니다. 귀하의 캡처 그룹(및 후속 역참조) 은 단지 /..*.*/첫 번째 /. 어쩌면 이것은 ?어떤 의미로 해석되기도 합니다.

내 생각에 당신이 원하는 것은

Source: (?<group>.*/)[^/]*\n…

이로 인해 강제 .*/로 통과하게 됩니다.마지막 /.

관련 정보