助け合いフォーラム
LinuC Lv1-101(Ver10.0)
問題ID : 14858
問題を開く
以下の「test.txt」ファイルのうち、「taro」の行にのみマッチするパターンを選びなさい。
正解
^t..o$
解説
以下は主な正規表現とその使用例をまとめたものです。
上表より、選択肢「^t..o$」は、行頭が「t」、行末が「o」、その間は任意の2文字を表しています。
よって、「taro」の行にのみマッチするのは「^t..o$」です。
したがって正解は
・^t..o$
です。
以下はgrepコマンドの実行結果です。正規表現にマッチする文字列を含む行を抽出します。
その他の選択肢については以下のとおりです。
・...o
任意の3文字の後の「o」にマッチしますが、行頭「^」や行末「$」が指定されていないことにより他の行にもマッチするため誤りです。
・[taro]
「t」「a」「r」「o」のいずれか1文字にマッチしますので、誤りです。
・^t*
行頭が「t」、もしくは行頭が「t」でない任意の文字列にマッチ(「*」は0回合致も含む)しますので、誤りです。
全ての行がマッチします。
・^t..o\$
行頭が「t」、続けて任意の2文字、その後「o$」で終わる文字列にマッチしますので、誤りです。また、設問のファイル内にこのような行はありません。
「\」により、「$」が文字として認識されます。
上表より、選択肢「^t..o$」は、行頭が「t」、行末が「o」、その間は任意の2文字を表しています。
よって、「taro」の行にのみマッチするのは「^t..o$」です。
したがって正解は
・^t..o$
です。
以下はgrepコマンドの実行結果です。正規表現にマッチする文字列を含む行を抽出します。
その他の選択肢については以下のとおりです。
・...o
任意の3文字の後の「o」にマッチしますが、行頭「^」や行末「$」が指定されていないことにより他の行にもマッチするため誤りです。
・[taro]
「t」「a」「r」「o」のいずれか1文字にマッチしますので、誤りです。
・^t*
行頭が「t」、もしくは行頭が「t」でない任意の文字列にマッチ(「*」は0回合致も含む)しますので、誤りです。
全ての行がマッチします。
・^t..o\$
行頭が「t」、続けて任意の2文字、その後「o$」で終わる文字列にマッチしますので、誤りです。また、設問のファイル内にこのような行はありません。
「\」により、「$」が文字として認識されます。
参考
【正規表現】
正規表現とは、文字列の特定のパターンを認識する為に使用する表現方法です。文字列の検索や置換などを行う際に利用します。正規表現には基本正規表現(BRE: Basic Regular Expression)と拡張正規表現(ERE: Extended Regular Expression)があります。
以下は主な正規表現とその使用例をまとめたものです。
なお、正規表現の「*」と、シェルによって解釈されるメタキャラクタの「*」では意味が異なるので注意してください。シェルは「*」を0文字以上の文字列と解釈します。
正規表現は明示的に「'」(シングルクォーテーション)や「"」(ダブルクォーテーション)の引用符で囲う事ができます。これらの引用符で囲まれた正規表現の記号は、シェルにメタキャラクタとして扱われなくなります。
正規表現を利用する主なコマンドには「sed」「grep」があります。
■sed
ファイルや標準入力の内容を編集して表示するコマンド
例1)「test.txt」ファイルの「#」から始まる行を削除して出力する場合
$ sed '/^#/d' test.txt
例2)「test.txt」ファイルの空行を削除して出力する場合
$ sed '/^$/d' test.txt
※正規表現では「^」は行頭、「$」は行末の意味であるため、「^」と「$」の間に文字を挟まずつなげることで、文字が存在しない行(空行)を表します。
■grep
ファイルや標準入力から、検索パターンにマッチする文字列を含む行を抽出するコマンド
例)1から5までのいずれかの文字がある行を「test.txt」ファイルから抽出する場合
$ grep '[1-5]' test.txt
[基本正規表現と拡張正規表現]
基本正規表現と拡張正規表現の違いに注意してください。
grepコマンドは、-Eオプションを付けない場合は検索パターンを基本正規表現と判断します。
grepコマンドの検索パターンで拡張正規表現を使うには、-Eオプションを指定します(egrepコマンドと同様)。
例)拡張正規表現「+」を使った抽出
なお、拡張正規表現の「?」「+」は、基本正規表現では「\?」「\+」で同様の指定ができます。
例)基本正規表現で「+」を扱う場合
正規表現とは、文字列の特定のパターンを認識する為に使用する表現方法です。文字列の検索や置換などを行う際に利用します。正規表現には基本正規表現(BRE: Basic Regular Expression)と拡張正規表現(ERE: Extended Regular Expression)があります。
以下は主な正規表現とその使用例をまとめたものです。
なお、正規表現の「*」と、シェルによって解釈されるメタキャラクタの「*」では意味が異なるので注意してください。シェルは「*」を0文字以上の文字列と解釈します。
正規表現は明示的に「'」(シングルクォーテーション)や「"」(ダブルクォーテーション)の引用符で囲う事ができます。これらの引用符で囲まれた正規表現の記号は、シェルにメタキャラクタとして扱われなくなります。
正規表現を利用する主なコマンドには「sed」「grep」があります。
■sed
ファイルや標準入力の内容を編集して表示するコマンド
例1)「test.txt」ファイルの「#」から始まる行を削除して出力する場合
$ sed '/^#/d' test.txt
例2)「test.txt」ファイルの空行を削除して出力する場合
$ sed '/^$/d' test.txt
※正規表現では「^」は行頭、「$」は行末の意味であるため、「^」と「$」の間に文字を挟まずつなげることで、文字が存在しない行(空行)を表します。
■grep
ファイルや標準入力から、検索パターンにマッチする文字列を含む行を抽出するコマンド
例)1から5までのいずれかの文字がある行を「test.txt」ファイルから抽出する場合
$ grep '[1-5]' test.txt
[基本正規表現と拡張正規表現]
基本正規表現と拡張正規表現の違いに注意してください。
grepコマンドは、-Eオプションを付けない場合は検索パターンを基本正規表現と判断します。
grepコマンドの検索パターンで拡張正規表現を使うには、-Eオプションを指定します(egrepコマンドと同様)。
例)拡張正規表現「+」を使った抽出
なお、拡張正規表現の「?」「+」は、基本正規表現では「\?」「\+」で同様の指定ができます。
例)基本正規表現で「+」を扱う場合
正規表現について
投稿日 2024/05/28
以下の「test.txt」ファイルのうち、文字列「taro」にのみマッチするパターンを選びなさい。(全て選択)
$ cat test.txt
taro
jiro
saburo
hanako
sachiko
akiko
の回答で
^t.*o$
^t..o$
となっていますが、問題として問われているのは正規表現化かメタキャラクタかの判別はどうされていますか?
^t* も正解と思ってしまいました
y
yklv
2024/05/29 04:17
メタキャラクタは厳密には、シェルによって特別に解釈される文字の意味ですが、ワイルドカードをイメージしていただくとよいかもしれません。
メタキャラクタ(シェルに直接解釈される位置にあるワイルドカード)はファイルやディレクトリの名称を検索するときに使用し、
正規表現はファイル内のテキストを検索するときに使用します。
この問題はファイル内のテキストを検索しようとしているため、正規表現について問われているのでしょう。
それから、「正規表現を使用したテキストファイルの検索」分野の問題は正規表現に関する問題で、
「コマンドラインの操作」分野の問題はメタキャラクタに関する問題と思われます。
コメント
この投稿に対して返信しませんか?