テキストファイルを子音で始まり、母音で終わる単語のみを含む他のテキストファイルに変換して、数字と句読点を削除する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'
答え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
) - 一致する部分文字列が行の先頭にあるか、単語を形成しない文字が前になければならないというテスト。繰り返しますが、行の末尾にあるか、単語を形成しない文字が後に続く必要があります。