問題ID:10885について
- フォーラムは新サイトへ移行しました。
- このフォーラムではゲスト投稿が禁止されています
問題ID:10885について
msg# 1
KAzmin_44
居住地: 東京
投稿数: 4
test.txtの内容を検索する際に、
「grep '1234.' test.txt」と、
「1234.」をシングルクォーテーションで囲んでいますが、
解説では、「.」を正規表現として扱っているところに疑問です。
シングルクォーテーションで囲んだ場合は「.」は
ただのドットと見なされるのでは…?
ご教示よろしくお願いしますm(__)m
「grep '1234.' test.txt」と、
「1234.」をシングルクォーテーションで囲んでいますが、
解説では、「.」を正規表現として扱っているところに疑問です。
シングルクォーテーションで囲んだ場合は「.」は
ただのドットと見なされるのでは…?
ご教示よろしくお願いしますm(__)m
Re: 問題ID:10885について
msg# 1.1
arashi1977
居住地: 広島
投稿数: 1715
引用:えっと、grepはデフォルトで検索パターンを基本正規表現として扱うようになってますので、シングルクォーテーションで囲って渡された「1234.」という文字列を基本正規表現で解析するんですね。
引用:もし渡された文字列を「1234.(ドット)」として処理させたいのであれば、
・上記の通り、-Fオプションを使ってPATTERNをただの文字列として扱うよう指定する
・grepではなくfgrepを使う
になりますね
「1234.」をシングルクォーテーションで囲んでいますが、
解説では、「.」を正規表現として扱っているところに疑問です。
シングルクォーテーションで囲んだ場合は「.」は
ただのドットと見なされるのでは…?
引用:
$ man grep
(略)
Matcher Selection
(略)
-F, --fixed-strings
Interpret PATTERN as a list of fixed strings, separated by newlines, any of which is to be
matched. (-F is specified by POSIX.)
-G, --basic-regexp
Interpret PATTERN as a basic regular expression (BRE, see below). This is the default.
・上記の通り、-Fオプションを使ってPATTERNをただの文字列として扱うよう指定する
・grepではなくfgrepを使う
になりますね
Re: 問題ID:10885について
msg# 1.1.1
KAzmin_44
居住地: 東京
投稿数: 4
早急なご回答ありがとうございますm(__)m
「.」を文字列として検索する方法についてはよくわかりましたが、
この問題における、シングルクォーテーションの働きが
依然として曖昧です;
「grep '1234.' test.txt」
「grep 1234. test.txt」
シングルクォーテーションありの場合となしの場合では、
何か違いがあるのでしょうか…
ちなみに、勉強用に立ててある仮想上のLinuxで、問題と同じ環境で
grepをかけたところ、シングルクォーテーションありでもなしでも
同じ結果でございました。
「.」を文字列として検索する方法についてはよくわかりましたが、
この問題における、シングルクォーテーションの働きが
依然として曖昧です;
「grep '1234.' test.txt」
「grep 1234. test.txt」
シングルクォーテーションありの場合となしの場合では、
何か違いがあるのでしょうか…
ちなみに、勉強用に立ててある仮想上のLinuxで、問題と同じ環境で
grepをかけたところ、シングルクォーテーションありでもなしでも
同じ結果でございました。
Re: 問題ID:10885について
msg# 1.1.1.1
arashi1977
居住地: 広島
投稿数: 1715
引用:この設問の形式の場合、grepとしては違いはありませんがシェルとしては扱いが異なります。
参考を見てみましょう。
引用:
問題ID:10486あたりを見ていただくとわかるのですが、コマンドに文字列を渡す前に、まずシェルが自分で文字列を先に解析して処理するんですね。なのでシングルクォーテーションが
・あり:「1234.」という文字列をgrepに渡す
・なし:1234. をシェルが解析し、解析後の文字列として「1234.」を渡す
という動きの違いがあります。
実例としては以下のパターンを見ていただくとわかりやすいかもです。
「2の次に空白(スペース)と何らかの文字がある」行を検索するつもりです。
当然ですが、以下は要件通りに検索できますよね?「2 .(正規表現の任意の1文字)」を指定していますので。
じゃあシングルクォーテーションで囲まなかったら?
シェルは「grepの第1引数を”2"、第2引数を".(カレントディレクトリ)"、第3引数を"test2.txt"」と解析して渡しますので、以下のようにディレクトリから「2」という文字列を検索するのとtest2.txtから「2」という文字列を検索するという2つの処理をするよう指示したことになります。
このように、「シェルにどういった文字列を渡して、それを解析して、コマンドを実行させるのか」という観点で考える必要があるんですね。
いかがでしょうか?
シングルクォーテーションありの場合となしの場合では、
何か違いがあるのでしょうか…
参考を見てみましょう。
引用:
正規表現は明示的に「'」(シングルクォーテーション)や「"」(ダブルクォーテーション)の引用符で囲う事ができます。これらの引用符で囲まれた正規表現の記号は、シェルにメタキャラクタとして扱われなくなります。
問題ID:10486あたりを見ていただくとわかるのですが、コマンドに文字列を渡す前に、まずシェルが自分で文字列を先に解析して処理するんですね。なのでシングルクォーテーションが
・あり:「1234.」という文字列をgrepに渡す
・なし:1234. をシェルが解析し、解析後の文字列として「1234.」を渡す
という動きの違いがあります。
実例としては以下のパターンを見ていただくとわかりやすいかもです。
$ cat test2.txt
123
12 3
1233
12 44
123445
01 3499
当然ですが、以下は要件通りに検索できますよね?「2 .(正規表現の任意の1文字)」を指定していますので。
$ grep '2 .' test2.txt
12 3
12 44
じゃあシングルクォーテーションで囲まなかったら?
シェルは「grepの第1引数を”2"、第2引数を".(カレントディレクトリ)"、第3引数を"test2.txt"」と解析して渡しますので、以下のようにディレクトリから「2」という文字列を検索するのとtest2.txtから「2」という文字列を検索するという2つの処理をするよう指示したことになります。
$ grep 2 . test2.txt
grep: .: ディレクトリです
test2.txt:123
test2.txt:12 3
test2.txt:1233
test2.txt:12 44
test2.txt:123445
このように、「シェルにどういった文字列を渡して、それを解析して、コマンドを実行させるのか」という観点で考える必要があるんですね。
いかがでしょうか?
Re: 問題ID:10885について
msg# 1.1.1.1.1
KAzmin_44
居住地: 東京
投稿数: 4
ご丁寧に解説頂きありがとうございました。
よく理解できました。
引き続き、学習を頑張っていこうと思いますm(__)m
よく理解できました。
引き続き、学習を頑張っていこうと思いますm(__)m