文章

2016-09-14 22 views
0

を開始する単語を決定するために、コマンドラインや正規表現を使用して、私はテキストを持っている:文章

This is a test. This is only a test! If there were an emergency, then Information would be provided for you. 

私は言葉が文章を開始するかを決定することができるようにしたいです。私が今持っていることは次のとおりです。

$ cat <FILE> | perl -pe 's/[\s.?!]/\n/g;' 

これだけ句読点を取り除くと改行に置き換え、私を与えます:

This 
is 
a 
test 

This 
is 
only 
a 
test 

If 
there 
were 
an 
emergency, 
then 
Information 
would 
be 
provided 
for 
you 

ここから私は何とか(それらの上には何もいずれかを持っていない単語を抽出できファイルの開始)または空白のスペースが必要ですが、これを行う方法がわかりません。だから、コマンドラインとして

+0

[文の最初の単語と一致する正規表現](http://stackoverflow.com/questions/14767080/regex-to-match-first-word-in-sentence) –

+0

私が探しているものではありません。一致する場合は、句読点が含まれます。また、grepでマッチを抽出する方法もわかりません。 – basil

答えて

6

あなたは、少なくともバージョン5.22.1のPerlの持っている(または5.22.0をし、この場合はthe bug described hereに影響されない)場合は、することができますあなたの正規表現で文の境界を使用してください。

use feature 'say'; 

foreach my $sentence (m/\b{sb}(\w+)/g) { 
    say $sentence; 
} 

あるいは、ワンライナーとして:あなたの例のテキストで呼び出された場合

perl -nE 'say for /\b{sb}(\w+)/g' 

、出力は次のようになります。

This 
This 
If 

それは、文境界である、\b{sb}を使用しています。あなたはそれについてa tutorial at brian d foy's blogを読むことができます。 \b{}はユニコード境界と呼ばれ、perlrebackslashに記述されています。

+1

うーん、良い解決策。私は '\ p {punct}'について考えましたが、もちろんカンマ(と他のもの)も得られます。 – Sobrique

+0

@Sobrique私はちょうど別のスクリプトで試しましたが、それは適切に動作していないようです。少なくとも私のコマンドラインでは、私がアルメニア語のGoogle翻訳を使用したとき、それは壊れました。 – simbabque

+0

これとは逆に、文章を開始しない大文字の単語は何ですか? – basil

1
#!/usr/bin/env perl 

use strict; 
use warnings; 
use Data::Dumper; 

local $/; 

my @words = <DATA> =~ m/(?:^|[\.!]+)\s+(\w+)/g; 

print Dumper \@words; 

__DATA__ 
This is a test. This is only a test! If there were an emergency, then Information would be provided for you. 

perl -ne 'print join "\n", m/(?:^|[\.!])\s+(\w+)/g;' somefile 
1

あなたは、各期間や!または?後の最初の抽出するために、このGNU grepコマンドを使用することができます。

grep -oP '(?:^|[.?!])\s*\K[A-Z][a-z]+' file 

This 
This 
If 

私はあなたがMr. Smithようなケースのために誤った結果を得ることができます警告しなければなりませんけど。

正規表現の分裂:

  • (?:^|[.?!]) - 試合開始またはDOTまたは!または?
  • \s* - 試合0以上の空白
  • \K - 一致したデータに
  • [A-Z][a-z]+を忘れてリセット一致 - 単語startignと大文字を一致させる
+0

これは最も簡単な解決策ですが、simbabqueのソリューションも同様に機能します。 – basil

+0

@basilそして_simple_によってあなたは_short_を意味しますか? :P – simbabque

+1

はい。私はまだPerlチャンピオンではなく、コマンドラインからパターンマッチングを行うことに慣れています。私は批判したり、不平を言ったりするつもりではない、私は謝罪する。また、これをはるかに大きな文書でテストしました。何らかの理由で、文章の始めではない単一文字を捉えていました。私は最後の*をこれを説明するために+に変更しました。一人称代名詞を使わない正式な文書で作業していますが、調べる対象になるので、私の状況ではうまくいきます。 – basil