辞書ファイル内で特定の特徴を持つ単語を検索する

辞書ファイル内で特定の特徴を持つ単語を検索する

テキスト ファイル内で、で始まりb、で終わり、またはoを含む単語を検索します。ig

上記の仕様を持つ単語を表示するターミナルにコマンドを入力する必要があります。

次のようなものを使用しましたが、1 つの単語で止まらず、空白が含まれています。

~$  egrep -n '\bb.*(i|g).*o\b'

私は Linux Ubuntu を使用していますが、ステートメントの実行方法がわかりません。いくつかの手順を試しましたが、すべて失敗しました。私は苦労しているので、正規表現ステートメントを解読するのを手伝ってくれる人はいませんか?

例: テキスト ファイルに次のランダムな単語があるとします。

boo djhg
bio jdjjf
dgdhd bgo
ghhh

次に、「boo」、「bio」、「bgo」という単語を強調表示する必要があります。

答え1

探しているコマンドは でgrep、必要な正規表現は ですb[[:alnum:]]*[ig][[:alnum:]]*o

  • [[:alnum:]]単一の英数字に一致します。
  • *前の表現の任意の数(ゼロを含む)に一致します。
  • [ig]は単一のiまたはと一致しますg
  • この特定の正規表現内の他のすべての文字 (bおよび) は、その文字自体に一致します。o

[[:alnum::]]*「rather than」を使用すると.*、スペースを含む単語の一致が回避されます。

grepのように使われる

grep OPTIONS 'EXPRESSION' INPUT-FILES

一致する行をEXPRESSION標準出力(この場合は端末)に出力します。

この場合、およびオプションを使用すると-w-o式が単語 (単語以外の文字で囲まれた文字列) に一致するように強制され、一致したデータのみ (行全体ではない) が返されます。

$ grep -w -o 'b[[:alnum:]]*[ig][[:alnum:]]*o' words
bio
bgo

あなたは、ハイライト一致した単語。これは GNU でgrep実行できることです。-oここでは、一致した各単語の行全体を取得するオプションを削除しています。そうしないと、以前と同じ結果が強調表示されるだけになり、退屈になります。

$ grep --color -w 'b[[:alnum:]]*[ig][[:alnum:]]*o' 単語
バイオ翻訳
いいえビーゴー

ご覧のとおり、これは一致を含む行の一致のみを表示します。一致が強調表示された状態で入力全体(一致のない行も含む)を表示するには、オプションを削除して次のようにします-w

$ grep --color -E '\bb[[:alnum:]]*[ig][[:alnum:]]*o\b|$' 単語
ブー djhg
バイオ翻訳
いいえビーゴー
ぐぅぅ

は拡張正規表現なので、-Eオプションを追加する必要がありました。 はどの単語境界でも一致します。|\b

答え2

私はgrepこれを次のように行います:

egrep -i "^b.*(i|g)+.*o$" /usr/share/dict/words
  • ^b「b」で始まる
  • .*いつでも何でも
  • (i|g)*「i」または「g」を1回以上
  • o$「o」で終わる

答え3

set -f; for w in `cat /usr/share/dict/words`; do
   case $w in b*[ig]*o ) echo "$w" ;; esac
done
# you could as well say: $(< /usr/share/dict/words) in place of the backquoted cat.
# if your version of bash supports it.

単語ファイルを単語に分割し$w、ワイルドカード チェックを実行します。

  • ワイルドカードパターンは b*[ig]*o で、次のように読み取られます。
  • $w は文字「b」で始まる必要があります。
  • $w は文字「o」で終わる必要があります。
  • $w が一致するには、その中間に「i」または「g」のいずれかが含まれている必要があります。
  • 一致が成功すると、その単語が表示されます。

関連情報