問題ID: 34214
- フォーラムは新サイトへ移行しました。
- このフォーラムではゲスト投稿が禁止されています
問題ID: 34214
msg# 1
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
です。
だったら納得できるのですが、問題文が「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
です。
Re: 問題ID: 34214
msg# 1.1
arashi1977
居住地: 広島
投稿数: 1715
引用:「左右どちらかの文字列を取得する」ということは「どちらかしか取得されない」という話になってしまいますよね。
じゃあってことで別の例でやってみると
演算子の両側の文字列が結果として出てます。これはまぁ a か c のどちらかが出るのでおかしくないでしょう。
しかし、このパターンだと
abcdeが出ます。ac以外の文字(bde)がどうして出るの?って疑問が生まれるようだと、(e)grep の挙動を誤解しています。
正規表現で「文字列1|文字列2 → 文字列1、文字列2のどちらかにマッチする」のは間違いないのですが、(e)grepではその正規表現をつかって行ごとに判定するのです。
なので34214の設問でいうと、「egrep 'taro|hanako' test.txt」とすると
となります。そして、私が2つ目に例示したものを使うと
となります。
「行ごとに、マッチする文字列があるか」という観点でもう一度見直してみてください。
下記の問題に関して、問題文が「taro」か「hanako」
だったら納得できるのですが、問題文が「taro」と「hanako」表記でこの回答になるのが納得できません。「|」は左右どちらかの文字列を取得する拡張正規表と認識していたのですが、誤っているのでしょうか?
じゃあってことで別の例でやってみると
$ cat test.txt
a
b
c
d
e
$ egrep 'a|c' test.txt
a
c
しかし、このパターンだと
$ cat test2.txt
abcde
fghij
klmno
$ egrep 'a|c' test2.txt
abcde
正規表現で「文字列1|文字列2 → 文字列1、文字列2のどちらかにマッチする」のは間違いないのですが、(e)grepではその正規表現をつかって行ごとに判定するのです。
なので34214の設問でいうと、「egrep 'taro|hanako' test.txt」とすると
taro ← taro にマッチするので、結果として出力する
hanako ← hanako にマッチするので、結果として出力する
jiro ← taro にも hanako にもマッチしないので出力しない
sachiko ← 同上
saburo ← 同上
emiko ← 同上
$ cat test2.txt
abcde
fghij
klmno
$ egrep 'e|f' test2.txt
abcde ← e にマッチするので、結果として出力する
fghij ← f にマッチするので結果として出力する
(klmnoの行はどちらにもマッチしないので出ない)
「行ごとに、マッチする文字列があるか」という観点でもう一度見直してみてください。
Re: 問題ID: 34214
msg# 1.2
nakate
投稿数: 2
arashi1977さん
丁寧に解説していただきありがとうございます。
おっしゃる通り「行ごとに、マッチする文字列があるか」という認識が抜けていました。
認識改めることができました。ありがとうございました。
丁寧に解説していただきありがとうございます。
おっしゃる通り「行ごとに、マッチする文字列があるか」という認識が抜けていました。
認識改めることができました。ありがとうございました。