grep을 사용하여 정규식으로 그룹화된 모든 줄을 찾습니다.

grep을 사용하여 정규식으로 그룹화된 모든 줄을 찾습니다.

따라서 문서에는 다음 형식의 문자열이 포함됩니다.

9s5s4sKs7h6h4h2d4dAdTd2c3c
6hKhQs6s3s7s5d3d2d9dKdAd4h
5s9sTs8hKhJc4s6c4hJsAc2dKs

각 줄은 숫자/대문자 및 소문자 쌍으로 구성됩니다.

동일한 소문자(예: Ks 또는 2d)를 가진 그룹 쌍(서로 옆에 있음)이 있는 모든 행을 찾고 싶습니다. 따라서 첫 번째 행에서 "s"가 있는 쌍은 모두 서로 옆에 있고, "h" 쌍, "d", "c" 순입니다.

가능한 소문자는 4개(s, c, d, h)뿐이므로 다음 정규식을 작성했습니다.

^.(.)(.\1)*.(.)(.\3)*.(.)(.\5)*.(.)(.\7)* .*$

그러나 그것은 다음과 같은 줄을 설명하지 않습니다.

6hKhQs6s3s7s5d3d2d9dKdAd4h

처음에는 "h" 쌍이 있고 그 다음에는 다른 쌍이 있고 마지막에는 "h" 쌍이 있습니다. 따라서 이 줄은 일치하지 않아야 합니다.

이를 위해 grep 명령을 사용합니다.

예:

grep -P "^.(.)(.\1)*.(.)(.\3)*.(.)(.\5)*.(.)(.\7)* .*$" file.txt

입력하다:

9s5s4sKs7h6h4h2d4dAdTd2c3c 
6hKhQs6s3s7s5d3d2d9dKdAd4h
5s9sTs8hKhJc4s6c4hJsAc2dKs

산출:

9s5s4sKs7h6h4h2d4dAdTd2c3c

이 줄에는 먼저 "s" 쌍이 있고, 그 다음 "h" 쌍, "d" 쌍, 마지막으로 "c" 쌍이 있습니다.

6hKhQs6s3s7s5d3d2d9dKdAd4h처음에 "h" 쌍 세트가 있고 다른 쌍이 있고 끝에 또 다른 "h" 쌍이 있기 때문에 행이 일치하지 않습니다. 이는 서로 그룹화되지 않았으며 행이 일치하지 않아야 함을 의미합니다.

답변1

문자는 으로 제한되므로 scdh동일한 문자가 두 번 나타날 때 다음을 사용하여 다른 문자가 있는 행을 필터링할 수 있습니다.

grep -ve 's.*[cdh].*s' -e 'c.*[sdh].*c' -e 'd.*[sch].*d' -e 'h.*[scd].*h'

또는 가능한 경우 Perl과 유사한 정규식을 사용하십시오.

grep -Pv '([scdh]).*(?!\1)[scdh].*\1'

여기서는 ASCII [a-z]대신 소문자를 사용할 수 있습니다 . [scdh]또는 모든 알파벳의 소문자를 [[:lower:]]나타냅니다 .\p{Ll}

관련 정보