助け合いフォーラム

Essentials

Linux Essentials(Ver1.6)
問題ID : 2651
問題を開く
ファイル「file.txt」から、grepコマンドを用いて、「a」から始まるアルファベット3文字以上の単語のある行を抽出したい。
正しいコマンドはどれか。

正解

grep 'a..' file.txt

解説

以下は主な正規表現です。


以上より正解は
・grep 'a..' file.txt
です。

例)ファイル「file.txt」から、aから始まるアルファベット3文字以上の単語がある行を抽出する


その他の選択肢については以下の通りです。

・grep 'a**' file.txt
・grep 'a*' file.txt
・grep 'a*.' file.txt
「a*」は、aが0回以上繰り返していることを意味しますから、aがない行も抽出されます。
本例の場合「# aa」「b」などすべての行が該当してしまいます。

・grep 'a\\' file.txt
文字aと文字\の組み合わせを抽出しています。

参考

【正規表現】
正規表現とは、文字列の特定のパターンを認識する為に使用する表現方法で、文字列の検索や置換などを行う際に利用します。
以下は正規表現の一部とその使用例です。

※「?」は、拡張正規表現(基本的な正規表現が拡張されたもの)の一つ。grepコマンドに使用する場合は「-E」オプションの指定が必要。

正規表現は、grepコマンドやsedコマンド(ファイルや標準入力の内容を編集して表示するコマンド)で使用することで非常に強力なパターンマッチングを行うことができます。

【正規表現とgrepコマンド】
ファイルや標準入力から、正規表現のパターンにマッチする文字列を含む行を抽出するにはgrepコマンドを利用します。
grepコマンドの書式と主なオプションは以下のとおりです。


例)ファイル「file.txt」から、「Linux Essentials」に該当する行を抽出する


例)ファイル「file.txt」から、大文字小文字にこだわらず「Linux Essentials」という文字列を抽出する


例)ファイル「file.txt」から、「Linux Essentials」にマッチした行数を表示する


例)ファイル「file.txt」から、「Linux Essentials」にマッチしない行を表示する

 オプションは組み合わせることも可能なため、「マッチしない行数」を表示する場合は「-cv」などと指定します。

●正規表現を用いた例

例)ファイル「file.txt」から、aから始まるアルファベット3文字以上の単語がある行を抽出する


例)ファイル「file.txt」から、文字「b」を含む行を抽出する


例)ファイル「file.txt」から、文字列「cat」または「cats」を含む行を抽出する


例)ファイル「file.txt」から、abcdeのいずれかの数字がある行を抽出する


例)行の先頭が「#」で始まる行を抽出する


例)空行(何も入力されていない行)以外を抽出する

 ファイルの先頭(^)と末尾($)に何も文字がないことから、「^$」は空行を意味します。

例)文字「$」を含む行を抽出する

 「$」は正規表現で末尾を意味しますが、文字として用いたい場合はエスケープ文字「\」を使用します。
上に戻る

「アルファベット3文字以上の単語」?

公開日 2024/05/16

正解は「grep 'a..' file.txt」となっていますが、この正規表現では「a10」のような数字混じりの文字列もヒットします。
正解をそのままにするなら、問題文のタイトルにある部分は「3文字以上の文字列」等になるのではないでしょうか?
問題文をそのままにするなら、正解は「grep -E 'a[a-z]{2}' file.txt」、
もしくは「grep 'a[a-z][a-z]' file.txt」等を選ぶ事になるのでは?と思います。

2024/05/16 12:13

正解をそのままにするなら、問題文のタイトルにある部分は「3文字以上の文字列」等になるのではないでしょうか?

「aから始まる3文字以上の文字列」に「aから始まるアルファベット3文字」は含まれないのでおかしい、ということでしょうか?
他の選択肢では

「a」から始まるアルファベット3文字以上の単語のある行

を抽出することはできず、また正答選択肢であれば設問の要件を満たしているようですが、問題点として指摘したいのはなんでしょうか?


コメント

k kirara397

2024/05/16 17:12

コメントありがとうございます。 問題点として指摘したいのは、正答のコマンドでは「aから始まるアルファベット3文字」以外の文字列(a10等)も抽出できてしまう点です。 ただ、抽出結果に不純物が混じっても構わない前提なら、問題ないと思います。

a arashi1977

2024/05/17 15:44

先に触れますが、kirara397さんの > 正解は「grep -E 'a[a-z]{2}' file.txt」、 > もしくは「grep 'a[a-z][a-z]' file.txt」等を選ぶ事になるのでは? が間違っているということを言いたいわけではないのです。ただ、実試験で同じような問題と選択肢が出題された場合、「これはおかしい。こういう回答になるべきだ(=この問題には回答できない)」ということにはならないですよね? 「抽出できてしまう」というのが問題だということですが、設問の要件である「aから始まるアルファベット3文字」、たとえば ask とか art とかを「抽出できない」のであれば明らかに問題の設定がおかしいですが、正答選択肢が要件通り抽出できるのであれば、まずはそこに問題はないと判断するのが妥当です。 ※「最適な回答ではないから問題だ」ではなく「正答は設問の要件を満たしているか」が重要なポイントなのです。さらにいえば誤答選択肢はどれも「抽出できない」のですから、問答無用で正答が決まってしまいますし。 とはいえ、きちんと理解した上で「より良い回答はこうだ!」というものをご自身で作れているので、そこは自信を持って良いと思います!

この返信に対して
コメントを記入できます

この投稿に対して返信しませんか?