Re: 問題ID:10885について

この質問の投稿一覧へ

なし Re: 問題ID:10885について

msg# 1.1.1.1
depth:
3
前の投稿 - 次の投稿 | 親投稿 - 子投稿.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

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

いかがでしょうか?

投稿ツリー

  >フォーラム検索へ


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