LinuCレベル1 GNUとUnixのコマンド 問44
GNUとUnixのコマンド/正規表現を使用したテキストファイルの検索ファイル list.txt から、「123-4567」のように数字3桁、ハイフン、数字4桁が続く文字列を含む行を表示したい。GNU grepのコマンドとして適切なものはどれか。
当サイトのオリジナル問題(LinuCレベル1の出題範囲「GNUとUnixのコマンド」に対応。実際の試験問題ではありません)
- Agrep '[0-9]{3}-[0-9]{4}' list.txt
- Bgrep -F '[0-9]{3}-[0-9]{4}' list.txt
- Cgrep -E '[0-9]{3}-[0-9]{4}' list.txt
- Dgrep -E '[0-9]+3-[0-9]+4' list.txt
正解: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」という意味になり、桁数の指定にはなりません。