大文字で始まる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
この呼び出しは.words
Raku にスペースで入力行を分割するよう指示します。単語はrotor
一緒にグループ化されます。このrotor
パラメータは、(2 => -1)
単語が重なる隣接ペアとして扱われ、重複する単語の連続ペアがそれぞれ生成されるように指示します。
単語ペアは$_
トピック変数にロードされ、一致するかどうかテストされます$_.map(*.wordcase)
。つまり、各単語(最初の文字)が大文字で示されている独自のバージョンと一致するかどうかがテストされます。一致するものがある場合は、$_
大文字(最初の文字)の単語のペアでなければならず、その単語のペアが返されます。
1行ずつ返す必要がある場合は、次のように.put
呼び出しを置き換えることができます(例print "$_, "
:)。unique
Rakuには固有の単語のペアだけが必要な場合でもルーチンがあります。
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