텍스트 파일 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 pcrepattern
PCRE 구문에 대한 자세한 내용은 참고자료를 참조하세요 .
답변3
사용grep
$ grep -Eo '([^:]*:[[:digit:]]+:?)+' input_file
00:04:
01:00:23:34
01:40:
01:40:32: