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
。
あるいは、オプションがサポートされていない場合は、grep
Perlを代わりに使用できます。-P
-o
perl -0lne 'print join "\n",(/(?<![.!?]) \K[A-Z]\w+/g)' file | sort -u