grep은 같은 단어에서 두 번 나타나는 문자 쌍을 찾습니다.

grep은 같은 단어에서 두 번 나타나는 문자 쌍을 찾습니다.

같은 단어에 두 번 나타나는 문자 쌍이 있는 단어를 찾는 올바른 표현은 무엇입니까? 이것은 내가 사용하고 있는 grep이지만 작동하지 않는 것 같습니다.

grep -E '(.{2}).*\1' input

입력 예:

tea sea
halal
unix
linux
Mississippi

출력은 다음과 같습니다:

halal
Mississippi

답변1

grep -E '(..).*\1' input

따라서 표현식은 다음과 같습니다.

  NODE                     EXPLANATION
  (                        group and capture to \1:
    .                        any character except \n
    .                        any character except \n
  )                        end of \1
  .*                       any character except \n (0 or more times
                           (matching the most amount possible))
  \1                       what was matched by capture \1

답변2

문제는 확장 정규식을 역참조와 결합한다는 것입니다. 그러나 이들은 의도적으로 표준에서 제외되었습니다. 그래서 사용

grep '\(.\{2\}\).*\1' input

대신에. 또는 더 간단하고 읽기 쉽습니다.

grep '\(..\).*\1' input

편집하다:

귀하의 질문을 다시 읽으면서 나는 "두 번"을 읽었다는 것을 깨달았습니다.같은 단어를 사용하다". 입력 데이터에는 한 줄에 하나의 단어만 포함되어 있으므로 괜찮습니다. 하지만 관련 테스트 사례를 포함하도록 질문을 변경하겠습니다.

"같은 단어를 두 번" 사용하려면 다음을 사용할 수 있습니다.

grep '\(..\)[[:alnum:]]*\1' input

또는 일부 버전에서는 grep바로가기를 사용하세요.

grep '\(..\)\w*\1' input

답변3

POSIX적으로:

grep '\([[:alpha:]]\{2\}\)[^[:space:]]*\1'

두 개의 알파벳 문자 시퀀스, 그 뒤에 원하는 수의 문자(공백 문자 제외), 동일한 알파벳 문자 시퀀스가 ​​포함된 행을 출력합니다.

POSIX ERE는 역참조를 지원하지 않고 BRE만 지원합니다. 그러나 일부 grep구현은 ERE 및 확장에서 역참조를 지원합니다.

예를 들어 -i일치시키려면 해당 옵션을 추가하세요.Meme

일치하는 단어를 포함하는 전체 줄이 아닌 일치하는 단어(한 줄에 하나씩)만 출력하려는 ​​경우에는 작동하지 grep않습니다 perl.

perl -Mopen=locale -lne 'print $& while /\S*([[:alpha:]]{2})\S*\1\S*/g'

GNU 구현을 사용하면 grep동일한 작업을 수행할 수 있습니다.

grep -Eo '\S*([[:alpha:]]{2})\S*\1\S*'

관련 정보