レス
元トピ
次レスタイトル
Re: 問題ID: 34214
フォーラム
最強WEB問題集LinuC/LPIC Lv1 101
投稿ユーザ(投稿日)
(2020/8/7)本文
-----引用(始)-----
下記の問題に関して、問題文が「taro」か「hanako」
だったら納得できるのですが、問題文が「taro」と「hanako」表記でこの回答になるのが納得できません。「|」は左右どちらかの文字列を取得する拡張正規表と認識していたのですが、誤っているのでしょうか?
-----引用(終)-----
「左右どちらかの文字列を取得する」ということは「どちらかしか取得されない」という話になってしまいますよね。
じゃあってことで別の例でやってみると
[code]
$ cat test.txt
a
b
c
d
e
$ egrep 'a|c' test.txt
a
c
[/code]
演算子の両側の文字列が結果として出てます。これはまぁ a か c のどちらかが出るのでおかしくないでしょう。
しかし、このパターンだと
[code]
$ cat test2.txt
abcde
fghij
klmno
$ egrep 'a|c' test2.txt
abcde
[/code]
abcdeが出ます。ac以外の文字(bde)がどうして出るの?って疑問が生まれるようだと、(e)grep の挙動を誤解しています。
正規表現で「文字列1|文字列2 → 文字列1、文字列2のどちらかにマッチする」のは間違いないのですが、(e)grepではその正規表現をつかって
行ごとに判定するのです。
なので34214の設問でいうと、「egrep 'taro|hanako' test.txt」とすると
[code]
taro ← taro にマッチするので、結果として出力する
hanako ← hanako にマッチするので、結果として出力する
jiro ← taro にも hanako にもマッチしないので出力しない
sachiko ← 同上
saburo ← 同上
emiko ← 同上
[/code]
となります。そして、私が2つ目に例示したものを使うと
[code]
$ cat test2.txt
abcde
fghij
klmno
$ egrep 'e|f' test2.txt
abcde ← e にマッチするので、結果として出力する
fghij ← f にマッチするので結果として出力する
(klmnoの行はどちらにもマッチしないので出ない)
[/code]
となります。
「行ごとに、マッチする文字列があるか」という観点でもう一度見直してみてください。
レス一覧
元トピ
次レス
Copyright (c) 2010
Ping-t All rights reserved.