Unix - egrepを使用して名前を検索する

Unix - egrepを使用して名前を検索する

txtファイルセット内の名前(国、人名などの最初の文字が大文字で表される単語)を区別するためにegrepスクリプトを作成しようとしています。数字を無視して、すべて大文字の単語、文の始め(それで「.」以降)を除いて単語だけを選択したいと思います。他の推奨パターンも歓迎します。

入力例は次のとおりです。

大衆は1800年代から火星に水があるかどうかに興味を持ってきました。 1877年、イタリアの天文学者ジョヴァンニ・スキアパレリ(Giovanni Schiaparelli)は、火星が地球にできるだけ近い(まだ5,600万キロメートルでかなり遠い)、火星を観察しました。彼は、チャンネルネットワークのように見えるものを含め、自分が見た表面の特徴の地図を描きました。

出力は次のとおりです。

Earth
Giovanni
Italian
Mars
Planet
Red
Schiparelli

答え1

1つの方法は、i)すべての改行を削除して文字列全体が1つの長い文字列になり、前のピリオドが前の行の文の最初の単語と一致しないようにし、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「行の一致する部分だけを印刷する」ことを意味します。

正規表現の使い方否定的なレビュー()、または、スペース、大文字、および1つ以上の単語文字を除くすべての項目のみが一致している(?>!foo)ことを確認してください。?!.[A-Z]

次の場合は失敗します。

  • 名前はファイルの最初の単語です。
  • 名前は文の最初の単語です。
  • María de Quintoなどの複合名がある場合は一致しますがMaríaスキップQuintoされますde

あるいは、オプションがサポートされていない場合は、grepPerlを代わりに使用できます。-P-o

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

関連情報