助け合いフォーラム

LinuC

LinuC Lv1-101(Ver10.0)
問題ID : 14536
問題を開く
以下の「test.txt」ファイルのうち、「12345」の行とのみマッチする正規表現はどれか。(全て選択)

$ cat test.txt
1
12
123
1234
12345

正解

^1.*5$

1...5

解説

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


選択肢の中で「12345」とのみマッチするのは、行頭が「1」、行末が「5」、その間は任意の文字列を表している「^1.*5$」です。
また、「1」と「5」の間に任意の3文字を含む「1...5」も「12345」とのみマッチします。

したがって正解は
・^1.*5$
・1...5
です。

以下はgrepコマンドの実行結果です。正規表現にマッチする文字列を含む行を抽出します。

$ grep '^1.*5$' test.txt
12345
$ grep '1...5' test.txt
12345

その他の選択肢については以下のとおりです。
・[1-5]
1から5までのいずれかの文字にマッチしますので、誤りです。

$ grep '[1-5]' test.txt
1
12
123
1234
12345

・1[2-5]
1の次の文字が、2から5までのいずれかの1文字という文字列にマッチしますので、誤りです。

$ grep '1[2-5]' test.txt
12
123
1234
12345

・^15$
行頭が1で、行末が5の文字(15)にマッチする正規表現ですので、誤りです。また、「test.txt」にマッチする行はありません。

$ grep '^15$' test.txt

・[^1-5]
1から5以外の1文字にマッチする正規表現ですので、誤りです。また、「test.txt」にマッチする行はありません。

$ grep '[^1-5]' 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/01

問題ID :14536 正規表現を使用したテキストファイルの検索

以下の「test.txt」ファイルのうち、「12345」の行とのみマッチする正規表現はどれか。(全て選択)

$ cat test.txt
1
12
123
1234
12345

選択肢
[1-5]
1...5
1[2-5]
^15$
[^1-5]
^1.*5$

正解
^1.*5$
1...5

^15$はそれぞれ行頭と行末が1と5という条件なので
12345の行とのみマッチすると考えていましたが違ったのでその理由が知りたいです。

2022/09/01 13:48

^15$はそれぞれ行頭と行末が1と5という条件なので
12345の行とのみマッチすると考えていましたが違ったのでその理由が知りたいです。

^15$ だと「15」しかマッチしないんですね。
12345とマッチするには「行頭が1」「234とマッチする何か」「行末が5」じゃないとダメなんです。


コメント

u unbernew

2022/09/01 15:51

行頭と行末だけが一致していても、その間の部分にマッチする条件がなければいけないんですね。間の部分は補完されて検索されると誤認していました。(1245,12245……のように、行頭と行末さえ指定していればこれらにも全てマッチするのかと思っていました)。理解できました、ありがとうございます。

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

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