助け合いフォーラム

LinuC

LinuC Lv1-101(Ver10.0)
問題ID : 14861
問題を開く
以下の「test.txt」ファイルに対して、「grep '1234.' test.txt」コマンドを実行した時に出力される行はどれか。(全て選択)

$ cat test.txt
123
1223
1233
12344
123445
0123499

正解

12344

123445

0123499

解説

grepコマンドはファイルや標準入力から、正規表現のパターンにマッチする文字列を含む行を抽出します。

grepコマンドの書式は以下のとおりです。

grep [オプション] 検索パターン [ファイル名]

以下は主な正規表現とその使用例をまとめたものです。


上表より、「1234.」は「文字列1234の後に任意の1文字」を意味します。
このパターンの文字列を含む行は「12344」「123445」「0123499」の3行です。

したがって正解は
・12344
・123445
・0123499
です。

以下は実行例です。

$ grep '1234.' test.txt
12344
123445
0123499

その他の選択肢は「grep '1234.' test.txt」を実行した際に表示されませんので、誤りです。

参考

正規表現とは、文字列の特定のパターンを認識する為に使用する表現方法です。文字列の検索や置換などを行う際に利用します。正規表現には基本正規表現(BRE: Basic Regular Expression)と拡張正規表現(ERE: Extended Regular Expression)があります。

以下は主な正規表現とその使用例をまとめたものです。


なお、正規表現の「*」と、シェルによって解釈されるメタキャラクタの「*」では意味が異なるので注意してください。シェルは「*」を0文字以上の文字列と解釈します。
正規表現は明示的に「'」(シングルクォーテーション)や「"」(ダブルクォーテーション)の引用符で囲う事ができます。これらの引用符で囲まれた正規表現の記号は、シェルにメタキャラクタとして扱われなくなります。

正規表現を利用する主なコマンドは以下のとおりです。

・grep
ファイルや標準入力から、検索パターンにマッチする文字列を含む行を抽出するコマンド
なお、「-E」オプションを併用すると拡張正規表現が使えます(egrepコマンドと同様)。

・sed
ファイルや標準入力の内容を編集して表示するコマンド

例1)1から5までのいずれかの文字がある行を「test.txt」ファイルから抽出する場合

$ grep '[1-5]' test.txt

例2)「test.txt」ファイルの「#」から始まる行を削除して出力する場合

$ sed '/^#/d' test.txt

基本正規表現と拡張正規表現の違いに注意してください。grepコマンドは、-Eオプションを付けないと検索パターンを基本正規表現と判断しますので、上表の拡張正規表現が使えません。

実行例)


基本正規表現では「?, +」は「\?, \+」とすることで、拡張正規表現と同様の意味を持つようになります。

上に戻る

不思議です。

公開日 2022/09/09

「1234.」は「文字列1234の後に任意の1文字」を意味します。
このパターンの文字列を含む行は「12344」「123445」「0123499」の3行です。

なぜ「0123499」が含まれるのですか?
仮に「012349」であれば、納得がいくのですが……不思議です。

2022/09/09 15:49

grep '1234.'は
「『1234』と、その後に1文字」が含まれている文字列を検索させます。

そのため、前後に何文字入っていたとしても「『1234』と、その後に1文字」の条件に該当すれば
検索合致となります。
例にしていただいている『012349』の「0」の立ち位置と、回答『0123499』の末尾「9」は
文字列の構成としては同じ立ち位置です。


コメント

y yaz4ki

2022/09/09 17:11

ありがとうございます!理解できてスッキリしました!

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

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