따라서 문서에는 다음 형식의 문자열이 포함됩니다.
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}