LinuCレベル1 GNUとUnixのコマンド 問29
GNUとUnixのコマンド/正規表現を使用したテキストファイルの検索ファイル data.txt に対して grep -F 'a.b' data.txt を実行したときの動作として適切なものはどれか。
当サイトのオリジナル問題(LinuCレベル1の出題範囲「GNUとUnixのコマンド」に対応。実際の試験問題ではありません)
- A「a」と「b」の間に任意の1文字がある文字列を含む行を表示する
- B「a.b」という文字列を含まない行を、すべて選んで表示する
- C「a.b」を拡張正規表現として解釈し、一致部分だけを表示する
- D「a.b」という文字列そのもの(ドットも文字)を含む行を表示する
正解:D
解説
grep -F は、パターンを正規表現ではなく固定文字列として扱うオプションです。このため「.」もメタ文字ではなく普通の文字として扱われ、「a.b」という文字列そのものを含む行だけが表示されます。オプションを付けない grep 'a.b' では「.」が任意の1文字を表すため、「axb」や「a-b」なども一致します。かつて使われた fgrep は grep -F と同じ働きをしますが、GNU grepでは長く非推奨とされており(アップストリームの3.8以降は実行時に警告も出ます)、grep -F を使うのが推奨されています。同様に egrep も grep -E を使うのが推奨されています。
選択肢ごとの解説
- A誤り。これはオプション無しの grep 'a.b' の動作です。-F を付けると「.」はメタ文字として扱われません。
- B誤り。一致しない行を表示するのは -v オプションの働きで、-F の働きではありません。
- C誤り。拡張正規表現として解釈するのは -E、一致部分だけを表示するのは -o の働きです。
- D正しい。-F はパターンを固定文字列として扱うため、「a.b」という文字列そのものを含む行が表示されます。