過去問ドリル

LinuCレベル1 GNUとUnixのコマンド 問44

GNUとUnixのコマンド/正規表現を使用したテキストファイルの検索

ファイル list.txt から、「123-4567」のように数字3桁、ハイフン、数字4桁が続く文字列を含む行を表示したい。GNU grepのコマンドとして適切なものはどれか。

当サイトのオリジナル問題(LinuCレベル1の出題範囲「GNUとUnixのコマンド」に対応。実際の試験問題ではありません)

正解:C

解説

拡張正規表現(ERE)では、{n} が「直前の要素のちょうどn回の繰り返し」を表します。grep -E を付けると正規表現がEREとして解釈されるため、[0-9]{3} で数字3文字、[0-9]{4} で数字4文字を表せます。オプションなしのgrepが使う基本正規表現(BRE)では、波かっこは \{3\} のようにバックスラッシュを付けないと繰り返しの意味にならず、そのままでは文字の「{」「}」として扱われます。

選択肢ごとの解説

  • A誤り。オプションなしのgrepは基本正規表現(BRE)で解釈するため、{3} は繰り返しではなく文字の「{3}」として扱われ、123-4567 には一致しません。
  • B誤り。-F は正規表現を使わず固定文字列として検索するオプションなので、[0-9]{3}-[0-9]{4} という文字列そのものを探してしまいます。
  • C正しい。-E で拡張正規表現を使うと、{3} や {4} が繰り返し回数の指定として働きます。
  • D誤り。+ は直前の要素の1回以上の繰り返しを表すため、「数字が1文字以上続いた後に文字の3」という意味になり、桁数の指定にはなりません。
LinuCレベル1の問題を演習モードで解く