여러 grep을 정규식과 결합

여러 grep을 정규식과 결합

나는 이 파일을 가지고 있습니다 :

10 replies
Big Horse
123sdf562
replies
1354654
Fat Cat
2 replies
White Horse
Big Cat
Little Dog
5 replies
725vgfvjgh123
Black Horse
Brown Cow
8798jgjh

답글 앞에 숫자가 오는 말과 숫자로 묶인 문자가 포함된 행을 추출하고 싶습니다. 따라서 내가 원하는 결과는 다음과 같아야 합니다.

10 replies
Big Horse
123sdf562
2 replies
White Horse
5 replies
725vgfvjgh123
Black Horse

이 코드는 grep '[0-9] replies\|[0-9][a-z]\|Horse' file다음을 반환합니다.

Big Horse
123sdf562
2 replies
White Horse
5 replies
725vgfvjgh123
Black Horse
8798jgjh

하지만 숫자로 묶이지 않기 8798jgjh때문에 출력에 표시되어서는 안 됩니다 .jgjh

grep '[0-9] replies\|[0-9][a-z][0-9]\|Horse' file작동하지 않습니다. 그렇다면 올바른 출력을 어떻게 얻을 수 있습니까?

답변1

이것을 사용할 수 있습니다 grep. 여러 위치에서 수량자(BRE에서)를 사용한다는 아이디어는 \{1,\}사용된 그룹에서 최소한 하나의 문자를 일치시키는 것입니다. 휴대용 버전은

grep '[0-9]\{1,\}[[:space:]]\{1,\}replies\|Horse\|[0-9]\{1,\}[a-z]\{1,\}[0-9]\{1,\}' file

grepGNU grep과 같이 ERE를 지원하는 버전 에서는 표현식에 추가 이스케이프 문자가 필요하지 않습니다.

grep -E '[0-9]{1,}[[:space:]]+replies|Horse|[0-9]{1,}[a-z]{1,}[0-9]{1,}' file

[0-9]문자 클래스 그룹을 및 등의 로케일 독립적인 그룹으로 바꿀 수 있습니다 .[a-z][[:digit:]][[:lower:]]

정규 표현식 - 검토

답변2

GNU와 함께 사용할 수 있습니다 grep.

$ grep 'Horse\|^[0-9]\+ replies$\|^[0-9]\+[^0-9]\+[0-9]\+$' file
10 replies
Big Horse
123sdf562
2 replies
White Horse
5 replies
725vgfvjgh123
Black Horse

명령의 문제점은 양자화하지 않으므로 [a-z]문자 하나만 찾습니다.

답변3

Standard 를 사용하면 grep일치시키려는 행에 대해 별도의 표현식을 유틸리티에 제공할 수 있습니다.

grep \
    -e 'Horse' \
    -e '[[:digit:]]\{1,\} replies' \
    -e '[[:digit:]]\{1,\}[[:alpha:]]\{1,\}[[:digit:]]\{1,\}' file

\{n,m\}이전 표현식이 최소 n한 번, 최대 한 번 일치하도록 강제합니다 m. 이는 POSIX 확장 정규식에서와 \{1,\}마찬가지로 이전 표현식이 적어도 한 번 일치한다는 것을 의미합니다.+

답변4

Raku(이전 Perl_6) 사용

raku -ne '.put if .grep( m:i/ horse / | / <digit>+ <ws> replies / | / <digit>+ <alpha>+ <digit>+ / );'

입력 예:

10 replies
Big Horse
123sdf562
replies
1354654
Fat Cat
2 replies
White Horse
Big Cat
Little Dog
5 replies
725vgfvjgh123
Black Horse
Brown Cow
8798jgjh

예제 출력:

10 replies
Big Horse
123sdf562
2 replies
White Horse
5 replies
725vgfvjgh123
Black Horse

이것은 Perl 프로그래밍 언어 계열에 속하는 Raku를 사용한 솔루션입니다. Raku(일명 Perl6)에 대한 작업은 2000년에 시작되었으며 PCRE(정규식)의 주요 개정판이 포함되었으며 일부는 이를 더 읽기 쉽게 간주했습니다.

위 코드는 여러 정규식 일치자를 grep사용할 수 있는 Raku의 명령을 사용합니다. 이 경우에는 부울 OR로 연결됩니다. 첫 번째 매처는 대소 문자를 구분하지 않는 "부사"를 사용하기 때문에 대소문자를 구분하지 않는 일치를 허용합니다 . 단지 일치시키려는 경우 그에 따라 변경하고 부사를 제거하세요.m/…/|horse:iHorse:i

물론 정규식을 작성할 때는 주의해야 하며 , , 및 뿐만 아니라 , 도 m/ Horse /일치 한다는 점에 유의해야 합니다 . when 앞에 다른 단어가 오고 그 사이에 공백이 있는 줄만 포함하면 됩니다 . 이 경우 해당 단어 가 적합할 수 있습니다.Big HorseBlack HorseWhite HorseHorse-facedHorsem/ <alpha>+ <ws> Horse /

https://docs.raku.org/언어/regexes
https://raku.org

관련 정보