Grepは大文字で連続した単語を探します。

Grepは大文字で連続した単語を探します。

大文字で始まる2つの連続した単語を見つけようとしています。

はい

入力する:x Yyy Zzz xx y

出力:Yyy Zzz

これで、すべての大文字を見つけることができますcat txtfile.txt | grep -o '\<[A-Z][a-z]*\>'

出力を取得するには、コードをどのように変更しますか?

フレンドリーな安否

答え1

Raku(以前のPerl_6)の使用

raku -ne 'my @a = .words.rotor(2 => -1); for @a {.put if $_ ~~ $_.map(*.wordcase)};'  

入力例:

x Yyy Zzz xx y
x Yyy Zzz Www
a Mmm: Yyy bbb
aaa aaa aaa
Ccc ccc CCC
Bbb Bbb Bbb Bbb

出力例:

Yyy Zzz
Yyy Zzz
Zzz Www
Mmm: Yyy
Bbb Bbb
Bbb Bbb
Bbb Bbb

この呼び出しは.wordsRaku にスペースで入力行を分割するよう指示します。単語はrotor一緒にグループ化されます。このrotorパラメータは、(2 => -1)単語が重なる隣接ペアとして扱われ、重複する単語の連続ペアがそれぞれ生成されるように指示します。

単語ペアは$_トピック変数にロードされ、一致するかどうかテストされます$_.map(*.wordcase)。つまり、各単語(最初の文字)が大文字で示されている独自のバージョンと一致するかどうかがテストされます。一致するものがある場合は、$_大文字(最初の文字)の単語のペアでなければならず、その単語のペアが返されます。

1行ずつ返す必要がある場合は、次のように.put呼び出しを置き換えることができます(例print "$_, ":)。uniqueRakuには固有の単語のペアだけが必要な場合でもルーチンがあります。

https://docs.raku.org/routine/wordcase
https://docs.raku.org/routine/rotor
https://raku.org

答え2

これを行う必要があります。

cat txtfile.txt | grep -o '[A-Z][a-z]* [A-Z][a-z]*'

答え3

Quasimodoの例と他の可能なケースを取り、句読点が一致しなければならず、2つ以上の連続した単語が大文字で表されると仮定した場合は、GNUを使用してくださいgrep

$ cat file
x Yyy Zzz xx y
x Yyy Zzz Www
a Mmm: Yyy bbb
aaa aaa aaa
Ccc ccc CCC
Bbb Bbb Bbb Bbb
$ grep -P '[AZ][^ ]*(?: +[AZ][^ ]*)+' ファイル
XyyyZzzxxy
XUZZZwwwうーん:うーんbbb
パフパフパフパフパフパフパフパフパフパフパフパフパフパフパフパフパフパフパフパフパフパフパフパフパフパフパフパフパフパフパフパフパフ

  • [A-Z][^ ]*大文字の後に空白以外の文字が続く単語を探します。
  • (?: +[A-Z][^ ]*)+1つ以上の空白の後に記載されているパターンは、1つ以上の繰り返し項目と一致します。

@casが提案したように、代替案があります。

を使用すると、-z行の境界を超えて連続した大文字の単語を検出します(例CCC\nBbb:)。スペースの代わりに使用すると、\sタブや他のスペースでも機能します。

grep -z -P '[A-Z][^\s]*(?:\s+[A-Z][^\s]*)+' file

関連情報