子音で始まり、母音で終わる単語をテキストから抽出します。

子音で始まり、母音で終わる単語をテキストから抽出します。

テキストファイルを子音で始まり、母音で終わる単語のみを含む他のテキストファイルに変換して、数字と句読点を削除するLinuxシェルプログラムを作成する必要があります。

コレクション=aoeui子音=bcdfghjklmnpqrstvwxyz

つまり、原文の形式はそのまま維持し、要件に合わない単語(母音で始まり子音で終わる)、数字、句読点のみを削除します。

grepどちらかを試してみましたが、結論を下すsedことはできませんでした。

答え1

POSIX的に:

consonants=BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz
vowels=AEIOUaeiou

< file tr -cs '[:alpha:]' '[\n*]' |
  grep -x "[$consonants].*[$vowels]"

英語の子音の1つで始まり、英語の母音の1つで終わるすべてのアルファベット文字(該当するロケールで分類されています)が報告されます。

< file tr -cs '[:alpha:]' '[\n*]' |
  grep -x "[$consonants][$consonants$vowels]*[$vowels]"

英字のみが含まれる内容に制限されます。 (onは英字ではないのでStéphane一致しません。)é許可する手紙)。

< file tr -cs "$consonants$vowel" '[\n*]' |
  grep -x "[$consonants].*[$vowels]"

これらの英語文字の1つ以外のすべての文字は無視されます(したがってfindperidicoinsideで検索されますperiódico)。

(一部のtr実装(GNUなど)はtrマルチバイト文字をサポートしていないため、とにかく対応するó / é文字によってブロックされます。)

たとえば、

FooBar Fee123 foo-bar periódico

FreeBSDシステム(POSIXを持つシステムtr)の一般的なen_US.UTF-8ロケールを入力すると、3つの解決策が得られます。

1            2           3

Fee          Fee         Fee
foo          foo         foo
periódico                peri
                         dico

どちらもU + 00E9文字で入力された位置と一致しませんが、BléすべてU + 0301の次の位置で結合された急性アクセント(アルファベット文字ではありません)が見つかります。一方、最初のものはtとWrittenと一致しません。一致するシャープネスを組み合わせた形。éBleBléeStéphane

perlこの問題を解決するには、最初の方法の代わりtrにフィルタリングする前に結合タグを保存する方法を使用できますgrep

< file perl -Mopen=locale -pe 's/[^\pL\pM]+/\n/g' |
  grep -x "[$consonants].*[$vowels]"

またはすべての操作を行いますperl

< file perl -Mopen=locale -lne 'print for
  grep /^[bcdfghj-np-tv-z].*[aeiou]$/i, /[\pL\pM]+/g'

答え2

GNUの使用grep:

grep -io '\<[bcdfghjklmnpqrstvwxyz][a-z]*[aeiou]\>'

答え3

そしてgrep

grep -oiw '[bcdfghjklmnpqrstvwxyz][a-z]*[aeiou]'

最初角かっこ表現子音、2 番目の文字 az、最後の母音と一致します。

答え4

初期テキスト形式を維持しながら希望の単語をフィルタリングするには -アッ解決策:

サンプルtextfileコンテンツ:

Any delicate you how kindness horrible outlived servants. You high bed wish help call draw side. Girl quit if case mr sing as no have. At none neat am do over will. Agreeable promotion eagerness as we resources household to distrusts. Polite do object at passed it is. Small for ask shade water manor think men begin. 

He oppose at thrown desire of no. Announcing impression unaffected day his are unreserved indulgence. Him hard find read are you sang. Parlors visited noisier how explain pleased his see suppose. Do ashamed assured on related offence at equally totally. Use mile her whom they its. Kept hold an want as he bred of. Was dashwood landlord cheerful husbands two. Estate why theirs indeed him polite old settle though she. In as at regard easily narrow roused adieus. 

So delightful up dissimilar by unreserved it connection frequently. Do an high room so in paid. Up on cousin ye dinner should in. Sex stood tried walls manor truth shy and three his. Their to years so child truth. Honoured peculiar families sensible up likewise by on in. 

働く:

awk -v IGNORECASE=1 '{ 
       for(i=1;i<=NF;i++) 
           if ($i~/^[bcdfghjklmnpqrstvwxz][a-z]*[aoeui]$/) 
               printf "%s ",$i; print "" 
       }' textfile > newfile

コンテンツnewfile:

delicate horrible case no none do we to Polite do shade 

He desire see Do mile he polite settle 

So Do so three to so sensible likewise

----------

別の行ですべての単語をフィルタリングするには -grep解決策:

grep -woi '[bcdfghjklmnpqrstvwxz][a-z]*[aoeui]' oldfile > newfile
  • -w--word-regexp) - 一致する部分文字列が行の先頭にあるか、単語を形成しない文字が前になければならないというテスト。繰り返しますが、行の末尾にあるか、単語を形成しない文字が後に続く必要があります。

関連情報