問題ID: 34214

  • フォーラムは新サイトへ移行しました。
  • このフォーラムではゲスト投稿が禁止されています
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 .2 | 投稿日時 2020-8-7 11:10
nakate  新米   投稿数: 2
下記の問題に関して、問題文が「taro」か「hanako」
だったら納得できるのですが、問題文が「taro」と「hanako」表記でこの回答になるのが納得できません。「|」は左右どちらかの文字列を取得する拡張正規表と認識していたのですが、誤っているのでしょうか?
どなたかご教示お願い致します。


問題文
egrepコマンドを使用して、以下の「test.txt」ファイルから「taro」と「hanako」という2つの文字列を取り出しなさい。

$ cat test.txt
taro
hanako
jiro
sachiko
saburo
emiko

回答
egrep 'taro|hanako' test.txt

解説
「taroまたはhanako」を示す文字列は、正規表現で「taro|hanako」と表すことが出来ます。また、「|」は拡張正規表現ですのでegrepコマンドを使用します。
なお、シェルが「|」をパイプと認識しないようにするため、検索パターンを引用符で囲う必要があります。

したがって正解は
・egrep 'taro|hanako' test.txt
です。
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2020-8-7 11:51
arashi1977  長老 居住地: 広島  投稿数: 1715
引用:
下記の問題に関して、問題文が「taro」か「hanako」
だったら納得できるのですが、問題文が「taro」と「hanako」表記でこの回答になるのが納得できません。「|」は左右どちらかの文字列を取得する拡張正規表と認識していたのですが、誤っているのでしょうか?
「左右どちらかの文字列を取得する」ということは「どちらかしか取得されない」という話になってしまいますよね。

じゃあってことで別の例でやってみると
$ cat test.txt
a
b
c
d
e
$ egrep 'a|c' test.txt
a
c
演算子の両側の文字列が結果として出てます。これはまぁ a か c のどちらかが出るのでおかしくないでしょう。

しかし、このパターンだと
$ cat test2.txt
abcde
fghij
klmno
$ egrep 'a|c' test2.txt
abcde
abcdeが出ます。ac以外の文字(bde)がどうして出るの?って疑問が生まれるようだと、(e)grep の挙動を誤解しています。

正規表現で「文字列1|文字列2 → 文字列1、文字列2のどちらかにマッチする」のは間違いないのですが、(e)grepではその正規表現をつかって行ごとに判定するのです。
なので34214の設問でいうと、「egrep 'taro|hanako' test.txt」とすると
taro ← taro にマッチするので、結果として出力する
hanako ← hanako にマッチするので、結果として出力する
jiro ← taro にも hanako にもマッチしないので出力しない
sachiko ← 同上
saburo ← 同上
emiko ← 同上
となります。そして、私が2つ目に例示したものを使うと
$ cat test2.txt
abcde
fghij
klmno
$ egrep 'e|f' test2.txt
abcde ← e にマッチするので、結果として出力する
fghij ← f にマッチするので結果として出力する
(klmnoの行はどちらにもマッチしないので出ない)
となります。

「行ごとに、マッチする文字列があるか」という観点でもう一度見直してみてください。
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2020-8-7 23:48
nakate  新米   投稿数: 2
arashi1977さん

丁寧に解説していただきありがとうございます。
おっしゃる通り「行ごとに、マッチする文字列があるか」という認識が抜けていました。

認識改めることができました。ありがとうございました。

  >フォーラム検索へ


Copyright (c) 2020 Ping-t All rights reserved.