3文字の単語のみを印刷するだけですが、単語文書は番号付きのリストです。
私が答えるべき正確な質問は次のとおりです。
ファイル内の文字クラスコマンドを使用して、
sed
長さが3文字にすぎないすべての動物名を見つけます。[[:lower:]]
animals
(3点)。
私が試したことは次のとおりです。
cat animals | sed '/{[:lower:]].../d'
cat animals | sed '/{[:lower:]]/d'
sed '/[[:lower:]]{3}/d' animals
animals
これは(ファイル)で単語を見つけるためのファイルです。
01. aardvark
02. badger
03. cow
04. dog
05. elephant
06. fox
07. goose
08. horse
09. iguana
10. jackal
11. koala
12. lamb
13. mongoose
14. narwhal
15. onyx
16. pig
17. quail
18. rat
19. snake
20. tiger
21. umbrellabird
22. vulture
23. walrus
24. xerus
25. yak
26. zebra
私はコードで[[:lower:]]を何度も使用できないことを発見しました。これを行う方法はありますか?
答え1
sed
ストリームエディタです。つまり、テキストを読み、編集し、結果を出力します。必ずしもファイルを処理する必要はなく、テキストストリームのみを処理するだけです。 (あなたの場合、テキストストリームはファイルから出てくるので、実際の違いはありません。)
以下を使用してsed
いくつかのオプションがあります。
- 3つの連続した小文字を含まないすべての行を削除すると、残りの行は渡され印刷されます。
- 正確に3つの連続した小文字を含む行のみを印刷します。
どちらの場合も、その3文字の前にスペースがあり、その後に何もないことを確認する必要があります。
これにより、4文字以上の単語が一致し、一致する行が削除されます。シーケンスの終わりをバインドしないので、より長いシーケンスの中央に一致します。
sed '/[[:lower:]][[:lower:]][[:lower:]][[:lower:]]/d' animals
これは与えられたファイルに対して機能しますが、2文字(または1文字)の動物がいる可能性を考慮しません。 (例えば、「牛」を考えてみてください)。したがって、私たちはそれらを取り除かなければなりません。この時点で、各行にsed
複数のタスクを順番に適用する必要があることを知らせる必要があります。また、$
正規表現が行の末尾にバインドされることを宣言する新しい文字を導入する必要があります。
- 1行に4文字がある場合は、その行を削除してください。
- スペース、2 文字、行の末尾を見つけたら、行を削除します。
- 空白、文字、行の終わりを見つけたら、行を削除します。
これは、次のように長い形式で書くことができます。
sed -e '/[[:lower:]][[:lower:]][[:lower:]][[:lower:]]/d' -e '/ [[:lower:]][[:lower:]]$/d' -e '/ [[:lower:]]$/d' animals
適切なバージョンがあれば、sed
より読みやすい形式に縮小できます。 (-r
フラグを探してください。)
答え2
私はsed (GNU sed) 4.2.2
あなたが望む結果を使用して得ています:
sed 's/^[[:digit:]]\{2\}[[:punct:]][[:space:]]\([[:lower:]]\{3\}\)/\1/gm' animals.txt | sed '/[[:lower:]]\{4\}/d'
次の手順を実行します。
- 2桁の数字で始まり、句読点(「.」)、スペース、少なくとも3つの小文字が含まれる単語が続く行を見つけます。
- この行で一致する小文字のグループを選択します。
- 前の手順の結果に基づいて、4つ以上の小文字の単語を削除します。
正確に3つの小文字を含む単語のみを出力します。
cow
dog
fox
pig
rat
yak
参考までに、GNU sedは次のものを使用します。この正規表現構文。
答え3
最も直接的な方法は次のとおりです。
$ sed -n '/^....[a-z]\{3\}$/p' animals
03. cow
04. dog
06. fox
16. pig
18. rat
25. yak
使用要件を満たすには、[[:lower:]]
次のように上記の内容を変更できます。
$ sed -n '/^....[[:lower:]]\{3\}$/p' animals
03. cow
04. dog
06. fox
16. pig
18. rat
25. yak
....
明示的にサイズ指定されたシーケンスに切り替えることもできます。
$ sed -n '/^.\{4\}[[:lower:]]\{3\}$/p' animals
03. cow
04. dog
06. fox
16. pig
18. rat
25. yak
引用する
答え4
あなたは近いです。 3つの要素を一致させる基本的な考え方は、正しい方向に進むことです。
{}
バックスラッシュが必要(または使用-E
)され、BREに構文エラーがあります。
しかし、正規表現:は[[:lower:]]\{3\}
3つまたはもっと数値。
あなたはする必要がありますアンカーspace
()から
end
()までの正規表現$
:
$ <infile sed -n '/ [[:lower:]]\{3\}$/p'
デフォルトでは、このコマンドは印刷せず、一致する行にのみp
印刷します。次のように逆書きすることもできます。
$ <infile sed '/ [[:lower:]]\{3\}$/!d'
つまり、基本印刷、1行ずつ印刷いいえ一致したら(d
)を削除してください。
あるいは、単語の境界を使用することもできます。
$ <infile sed '/\b[[:lower:]]\{3\}\b/!d'
または:
$ <infile sed '/\<[[:lower:]]\{3\}\>/!d'
おそらくERE正規表現を試してみてください。
$ <infile sed -E '/\b[[:lower:]]{3}\b/!d'
動物の名前だけが必要な場合は、以下を使用してください。
$ <infile sed -E '/.*\<([[:lower:]]{3})\>/!d;s//\1/'
cow
dog
fox
pig
rat
yak