テキストファイルを子音で始まり、母音で終わる単語のみを含む他のテキストファイルに変換して、数字と句読点を削除する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つ以外のすべての文字は無視されます(したがってfindperi
とdico
insideで検索されます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と一致しません。一致するシャープネスを組み合わせた形。é
Ble
Blé
é
e
Sté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'