UUID는 '-'로 구분된 5개의 그룹으로 구성되며 16진수 문자로 구성됩니다. 각 그룹의 문자가 알파벳순으로 정렬된 모든 UUID를 찾는 정규식을 만들려고 합니다.
입력하다:
9a578cf1-bc9f-49ad-8294-a61b736088c5
64efc3d9-448a-4902-a6c6-61849ac6c7ef
75b39f65-b614-427a-af62-922534bee490
산출:
9a578cf1-bc9f-49ad-8294-a61b736088c5
각 문자 세트는 acf bcf ad abc이며 알파벳 순서로 정렬됩니다.
두 번째 UUID의 각 그룹에 있는 문자는 알파벳 순서가 아닙니다: efc 및 accef
또한 그룹에는 동일한 문자가 한 번만 있을 수 있으므로 세 번째 UUID의 "bee"도 알파벳순으로 간주되지 않습니다.
다음 grep 명령을 사용해 보았습니다.
grep -P "^[0-9]*a?[0-9]*b?[0-9]*c?[0-9]*d?[0-9]*e?[0-9]*f?[0-9]*(-[0-9]*a?[0-9]*b?[0-9]*c?[0-9]*d?[0-9]*e?[0-9]*f?[0-9]*){4}$" file.txt
하지만 이로 인해 역추적 오류가 발생합니다.
답변1
grep
느리기는 하지만 GNU 3.7 및 3.8 버전 에서 작동합니다 .
다른 grep
구현 및/또는 버전이나 다른 정규식 엔진으로 전환하면 도움이 될 수 있습니다. 코드에는 Perl과 관련된 내용이 없습니다. 예를 들어 -E
여기에서 대신 사용할 수 있습니다(-P
egrep
알고리즘은 역추적의 필요성을 방지합니다.여기).
(?>...)
어떤 경우든 역추적은 불필요하고 비생산적이므로 (perl 확장 프로그램)을 사용하여 역추적을 완전히 비활성화하는 것이 좋습니다 .
grep -Px '(?>(\d*a?\d*b?\d*c?\d*d?\d*e?\d*f?\d*)(?:-(?1)){4})'
몇 가지 추가 단축키가 있습니다:
-x
대신 사용^
하고$
고정하십시오.\d
대신[0-9]
(펄 확장)(?1)
중복을 피하기 위해 첫 번째 세트와 동일한 정규식을 호출합니다(perl 확장).