같은 단어에 두 번 나타나는 문자 쌍이 있는 단어를 찾는 올바른 표현은 무엇입니까? 이것은 내가 사용하고 있는 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*'