반복 패턴의 반복 패턴을 찾기 위해 grep하는 방법은 무엇입니까?

반복 패턴의 반복 패턴을 찾기 위해 grep하는 방법은 무엇입니까?

텍스트 파일 Fred.txt가 있습니다.

% cat -e fred.txt 
00:$
00:04:$
01:00:23:34$
01:$
01:40:$
01:40:32:$
%

grep을 사용하여 2자리 숫자와 콜론이 포함된 줄을 찾을 수 있습니다.

% pcregrep -e '[\d]{2}:' fred.txt   
00:
00:04:
01:00:23:34
01:
01:40:
01:40:32:
%

하지만 패턴의 반복되는 패턴을 얻으려고 하면 찾지 못합니다.

% pcregrep -e '[[\d]{2}:]{2}' fred.txt
%

나는 다음과 같은 결과를 얻고 싶습니다.

% pcregrep -e '[\d]{2}:[\d]{2}:' fred.txt
00:04:
01:00:23:34
01:40:
01:40:32:
%

결국에는 더 큰 파일에서 더 많은 중첩된 반복 패턴을 찾게 되므로 패턴이 반복될 때마다 정의할 필요가 없습니다. 이 패턴을 반복하는 줄을 찾으려면 어떻게 해야 합니까?

답변1

GNU 사용grep

$ grep -Eo '([0-9]{2}:){2,}' fred.txt 
00:04:
01:00:23:
01:40:
01:40:32:

답변2

[xyz]소위 대괄호 표현이 일치합니다.하나세트 내의 문자. 여기, x, y또는 z.

[\d]POSIX 기본 정규식에서는 or 와 일치 \하지만 Perl 호환 정규식에서는 숫자 d만 일치하는 것과 같습니다 . \d예를 들어 이를 통해 [\da-fA-F]16진수를 일치시킬 수 있지만 이 [\d]경우에는 를 사용하는 것이 더 나으므로 의미가 없습니다 \d.

\(...\)그러나 POSIX 기본 정규식이나 (...)POSIX 확장 정규식 또는 PCRE의 필수 그룹화에서는 작동하지 않습니다 .

(?:...)역참조를 생성하지 않는 것, (?|...)역참조의 대체 번호 매기기에 영향을 미치는 것, (?>...)그룹화 연산자의 소유 변형 등과 같은 PCRE의 다른 그룹화 변형이 있습니다 .

여기서는 역참조가 필요하지 않으므로 다음을 사용할 수도 있습니다 (?:...).

pcregrep '(?:\d{2}:){2}'

다음 줄과 일치합니다포함하다2(2자리 뒤에 1자리 :). 다음 줄을 일치시키려면실제로 x이 옵션을 추가해야 합니다 -x.

여기,

pcregrep '(?:\d\d:){2}'

실제로는 더 짧을 겁니다.

pcregrep '(\d\d:){2}'

동일한 효과를 가지지만 pcregrep방해하지 말라고 지시받지 않았기 때문에 효율성이 약간 떨어질 수 있습니다.포착안에 무엇이 들어있나요 (...)?

man pcrepatternPCRE 구문에 대한 자세한 내용은 참고자료를 참조하세요 .

답변3

사용grep

$ grep -Eo '([^:]*:[[:digit:]]+:?)+' input_file
00:04:
01:00:23:34
01:40:
01:40:32:

관련 정보