助け合いフォーラム
LPIC Lv1-101(Ver5.0)
問題ID : 3577
問題を開く
以下の「test.txt」ファイルに対して、「grep '1234.' test.txt」コマンドを実行した時に出力される行はどれか。(全て選択)
$ cat test.txt
123
1223
1233
12344
123445
0123499
$ 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」を実行した際に表示されませんので、誤りです。
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文字以上の文字列と解釈します。
正規表現は明示的に「'」(シングルクォーテーション)や「"」(ダブルクォーテーション)の引用符で囲う事ができます。これらの引用符で囲まれた正規表現の記号は、シェルにメタキャラクタとして扱われなくなります。
正規表現を利用する主なコマンドには「sed」「grep」があります。
■sed
ファイルや標準入力の内容を編集して表示するコマンド
例)「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
ファイルや標準入力の内容を編集して表示するコマンド
例)「test.txt」ファイルの「#」から始まる行を削除して出力する場合
$ sed '/^#/d' test.txt
■grep
ファイルや標準入力から、検索パターンにマッチする文字列を含む行を抽出するコマンド
例)1から5までのいずれかの文字がある行を「test.txt」ファイルから抽出する場合
$ grep '[1-5]' test.txt
[基本正規表現と拡張正規表現]
基本正規表現と拡張正規表現の違いに注意してください。
grepコマンドは、-Eオプションを付けない場合は検索パターンを基本正規表現と判断します。
grepコマンドの検索パターンで拡張正規表現を使うには、-Eオプションを指定します(egrepコマンドと同様)。
例)拡張正規表現「+」を使った抽出
なお、拡張正規表現の「?」「+」は、基本正規表現では「\?」「\+」で同様の指定ができます。
例)基本正規表現で「+」を扱う場合
「文字列1234の後に任意の1文字」を意味するのに、「123445」「0123499」が該当するのはなぜですか?
投稿日 2022/12/16
解説に
「1234.」は「文字列1234の後に任意の1文字」を意味します。
とあるので、「12344」が当てはまるのはわかるのですが、
1234の後に2文字続く、「123445」「0123499」が当てはまるのがよくわかりません。
教えていただけないでしょうか。
2022/12/18 18:06
- → 1234となんか1文字
1234となんか1文字 を「含む」文字列です ちょっと引っかかっちゃいますね。
123
1223
1233
「12344」
「12344」5
0「12349」9
ということだと思います。
コメント
N
NNN284
2023/01/19 14:22
私も同じ問題に引っかかってAmazonLinux2環境にて実際にテストしました
そして間違いなく解答のような動作をすることが確認できました
しかし、他のツールでは正規表現で表現するなら
1234.*
等の厳格に指定した状況でなくては引っ掛からないものが多いので違和感がありますよね
そこでもうちょっと調べて見たのですが、
grepコマンドには-wというオプションがあり、動作としては「検索条件を単語として検索する」というオプションとなります
つまり、-wオプションを使用しない通常のコマンド状態では検索条件を単語として扱っていない……文の中の一部分として扱っているという事のようです
以上参考になりましたら幸いです
コメント
この投稿に対して返信しませんか?
y yoshinomaron
2023/03/18 19:51
ご返信が漏れており大変失礼いたしました。教えていただきありがとうございました。