Unix - egrep을 사용하여 이름 찾기

Unix - egrep을 사용하여 이름 찾기

txt 파일 세트에서 이름(국가, 사람 이름 등과 같이 첫 글자가 대문자로 표시된 단어)을 구별하기 위해 egrep 스크립트를 작성하려고 합니다. 숫자를 무시하고 모두 대문자 단어, 문장 시작 부분(그래서 "." 이후)을 제외하고 단어만 선택하고 싶습니다. 다른 권장 패턴도 환영합니다.

입력 예는 다음과 같습니다.

대중은 1800년대부터 화성에 물이 있는지에 관심을 가져왔습니다. 1877년 이탈리아 천문학자 조반니 스키아파렐리(Giovanni Schiaparelli)는 화성이 지구에 최대한 가까웠을 때(여전히 5,600만 킬로미터로 상당히 멀었음) 화성을 관찰했습니다. 그는 채널 네트워크처럼 보이는 것을 포함하여 자신이 본 표면 특징의 지도를 그렸습니다.

출력은 다음과 같습니다:

Earth
Giovanni
Italian
Mars
Planet
Red
Schiparelli

답변1

한 가지 방법은 i) 모든 줄 바꿈을 제거하여 전체 문자열이 하나의 긴 문자열이 되도록 하고 이전 마침표가 이전 줄에 있는 문장의 첫 번째 단어와 일치하지 않도록 하고 ii) 첫 번째 문자를 찾는 것입니다. 모든 단어는 대문자로 표시되고 앞의 문자가 ., ?, 중 하나가 아닙니다 !. 예를 들어:

$ tr '\n' ' ' < file | grep -Po '(?<![.!?]) \K[A-Z]\w+' 
Mars
Mars
Earth
Italian
Giovanni
Schiaparelli
Red
Planet

중복 항목을 제거하십시오.

$ tr '\n' ' ' < file  | grep -Po '(?<![.!?]) \K[A-Z]\w+' | sort -u
Earth
Giovanni
Italian
Mars
Planet
Red
Schiaparelli

tr줄 바꿈을 공백으로 바꾸십시오. 이 -P스위치는 PCRE(Perl Compatible Regular Expressions) 지원을 활성화하여 우리가 사용하고 있는 고급 기능을 제공합니다. 이는 -o"행의 일치하는 부분만 인쇄"한다는 의미입니다.

정규식 사용법부정적인 리뷰( ) , 또는 , 공백, 대문자 및 하나 이상의 단어 문자를 제외한 모든 항목 (?>!foo)만 일치하는지 확인합니다 .?!.[A-Z]

다음과 같은 경우에는 실패합니다.

  • 이름은 파일의 첫 번째 단어입니다.
  • 이름은 문장의 첫 번째 단어입니다.
  • María de Quinto와 같은 복합 이름이 있는 경우 일치 María하지만 Quinto건너뜁니다 de.

또는 옵션을 grep지원하지 않으면 Perl 을 대신 사용할 수 있습니다.-P-o

perl -0lne 'print join "\n",(/(?<![.!?]) \K[A-Z]\w+/g)' file | sort -u

관련 정보