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

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

テキストファイルを子音で始まり、母音で終わる単語のみを含む他のテキストファイルに変換して、数字と句読点を削除する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'

おすすめ記事