Linux grep 명령을 사용하여 동일한 문자로 시작하고 끝나는 단어 검색

Linux grep 명령을 사용하여 동일한 문자로 시작하고 끝나는 단어 검색

Linux를 사용하여 파일에서 동일한 문자로 시작하고 끝나는 단어를 검색하는 방법grep주문하다? 나는 답변 중 일부를 시도했지만 소용이 없었습니다. 감사해요!

답변1

입력에 한 줄에 하나의 단어가 포함되어 있다고 가정하면 다음을 사용할 수 있습니다.

grep -x '\(.\).*\1' file

...동일한 문자로 시작하고 끝나는 모든 줄을 추출합니다. 이는 줄의 첫 번째 문자 캡처를 사용하고 \(.\)줄의 나머지 문자가 무엇이든 되도록 허용한 다음( 와 함께 .*) 역참조를 사용하여 끝에 있는 캡처된 문자와 일치하도록 강제함으로써 수행됩니다 \1.

이 옵션은 패턴이 라인의 일부가 아니라 전체 라인과 일치해야 함을 유틸리티에 -x알려줍니다 . grep그렇지 않은 경우 -x정규식에 명시적인 앵커를 삽입하여 전체 행이 일치하는지 확인해야 합니다.^\(.\).*\1$

내 시스템 사전에서 실행되는 예는 처음 5개 결과만 표시합니다.

$ grep -x '\(.\).*\1' /usr/share/dict/words | head -n 5
aa
aba
abaca
abasia
abepithymia

한 줄에 공백으로 구분된 여러 단어가 포함된 입력을 처리하는 경우 먼저 텍스트를 한 줄에 한 단어로 분할하여 텍스트를 전처리할 수 있습니다. 여기에서는 tr공백을 개행으로 바꾸고 다음을 통해 중복 항목을 제거하면서 모든 문자를 소문자로 추가로 변환합니다 sort -u.

tr ' [:upper:]' '\n[:lower:]' <file | sort -u | grep -x '\(.\).*\1'

이는 "일반 텍스트"에 구두점 및 단어의 일부가 아닌 기타 문자가 포함될 수 있다는 사실을 무시한다는 점에 유의하십시오.


grep명령이 기술적으로 동일한 문자로 시작하고 끝나는 단일 문자 단어를 생략했다는 것이 주석(현재 삭제됨)에서 지적되었습니다 .

이것을 얻으려면:

grep -x -e '\(.\).*\1' -e . file

이제 동일한 문자로 시작하고 끝나는 줄이나 단일 문자만 포함하는 줄이 반환됩니다.

답변2

통과되면단어, 공백이 아닌 문자가 하나 이상 포함된 시퀀스를 의미합니다. GNU를 사용하면 grep다음과 같이 할 수 있습니다.

grep -Po '(?<!\S)(?=(\S))\S*\1(?!\S)' your-file

\S*음의 뒤돌아보기( ) 및 a를 사용하여 처음에 미리보기 연산자( )에 캡처된 것과 동일한 공백이 아닌 문자( )로 끝나는 0개 이상의 공백이 아닌 문자( )의 시퀀스와 일치합니다. 발견된 단어의 앞이나 뒤에 공백이 아닌 문자가 오지 않습니다.\1(\S)(?=...)(?<!...)(?!...)

이 답변에서 다음을 찾을 수 있습니다.

'(?<!\S)(?=(\S))\S*\1(?!\S)'
sequences
0
that
a

That또한 해당 옵션을 추가했는지 확인합니다 -i.

답변3

사용행복하다(이전 Perl_6)

~$ raku -ne '.put if m:i/ ^ (.) .*? $0 $ /;'  file

-ne파일을 한 줄씩 읽으려면 비자동 인쇄 명령줄 플래그를 사용하십시오. Raku의 캡처는 (... 괄호로 표시되며 )로 시작됩니다 $0. 부사 일치는 대소문자를 구분하지 않습니다 :i.

~$ cat /usr/share/dict/words | raku -e 'my @a; @a.push($_) if / ^ (.) .*? $0 $ / for $*IN.lines; .put for @a.elems;'
9917

elems( 일치하는 단어 목록을 반환하려면 위의 호출을 제거하세요 ).

https://raku.org

관련 정보