問題ID:10885について

  • フォーラムは新サイトへ移行しました。
  • このフォーラムではゲスト投稿が禁止されています
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2015-8-2 15:01
KAzmin_44  新米 居住地: 東京  投稿数: 4
test.txtの内容を検索する際に、
「grep '1234.' test.txt」と、
「1234.」をシングルクォーテーションで囲んでいますが、
解説では、「.」を正規表現として扱っているところに疑問です。

シングルクォーテーションで囲んだ場合は「.」は
ただのドットと見なされるのでは…?

ご教示よろしくお願いしますm(__)m
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2015-8-2 15:39 | 最終変更
arashi1977  長老 居住地: 広島  投稿数: 1715
引用:
「1234.」をシングルクォーテーションで囲んでいますが、
解説では、「.」を正規表現として扱っているところに疑問です。

シングルクォーテーションで囲んだ場合は「.」は
ただのドットと見なされるのでは…?
えっと、grepはデフォルトで検索パターンを基本正規表現として扱うようになってますので、シングルクォーテーションで囲って渡された「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.
もし渡された文字列を「1234.(ドット)」として処理させたいのであれば、
・上記の通り、-Fオプションを使ってPATTERNをただの文字列として扱うよう指定する
・grepではなくfgrepを使う
になりますね
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2015-8-2 16:26
KAzmin_44  新米 居住地: 東京  投稿数: 4
早急なご回答ありがとうございますm(__)m
「.」を文字列として検索する方法についてはよくわかりましたが、
この問題における、シングルクォーテーションの働きが
依然として曖昧です;

「grep '1234.' test.txt」
「grep 1234. test.txt」

シングルクォーテーションありの場合となしの場合では、
何か違いがあるのでしょうか…

ちなみに、勉強用に立ててある仮想上のLinuxで、問題と同じ環境で
grepをかけたところ、シングルクォーテーションありでもなしでも
同じ結果でございました。
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2015-8-2 16:59
arashi1977  長老 居住地: 広島  投稿数: 1715
引用:
シングルクォーテーションありの場合となしの場合では、
何か違いがあるのでしょうか…
この設問の形式の場合、grepとしては違いはありませんがシェルとしては扱いが異なります。

参考を見てみましょう。
引用:
正規表現は明示的に「'」(シングルクォーテーション)や「"」(ダブルクォーテーション)の引用符で囲う事ができます。これらの引用符で囲まれた正規表現の記号は、シェルにメタキャラクタとして扱われなくなります。

問題ID:10486あたりを見ていただくとわかるのですが、コマンドに文字列を渡す前に、まずシェルが自分で文字列を先に解析して処理するんですね。なのでシングルクォーテーションが
・あり:「1234.」という文字列をgrepに渡す
・なし:1234. をシェルが解析し、解析後の文字列として「1234.」を渡す
という動きの違いがあります。

実例としては以下のパターンを見ていただくとわかりやすいかもです。
$ cat test2.txt
123
12 3
1233
12 44
123445
01 3499
「2の次に空白(スペース)と何らかの文字がある」行を検索するつもりです。

当然ですが、以下は要件通りに検索できますよね?「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

このように、「シェルにどういった文字列を渡して、それを解析して、コマンドを実行させるのか」という観点で考える必要があるんですね。

いかがでしょうか?
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2015-8-2 20:27
KAzmin_44  新米 居住地: 東京  投稿数: 4
ご丁寧に解説頂きありがとうございました。
よく理解できました。

引き続き、学習を頑張っていこうと思いますm(__)m

  >フォーラム検索へ


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