0

簡単な質問があります:

以下を含むファイルがあるとします。

abc$
$
$abc

そして、grep "c\$" filename を使用すると、abc$ のみが得られます。しかし、grep "c\\$" を使用すると、abc$ が得られます。

私はかなり混乱しています。バックスラッシュはすでに $ の特別な意味を無効にしていませんか? それで、grep "c\$" filename は abc$ という行を返しますか?

誰が親切に私に提案をしてくれることを本当に願っています。

よろしくお願いします。

4

4 に答える 4

2

二重引用符はあなたを捨てています。これにより、シェルはメタ文字を展開できます。一重引用符のみを使用したLinuxボックスで:

$ grep 'abc$' <<<'abc$'
$ grep 'abc\$' <<<'abc$'
$ grep 'abc\$' <<<"abc$"
abc$
$ grep 'abc$' <<<'abc$'
$ grep 'abc\\$' <<<'abc$'
$ 

上記grepの 5 つのコマンドのうち、パターンを検出 (および出力) したのはabc\$. をエスケープしなかった場合、行末に固定され$た文字列を探していると見なされます。abcの前にバックスラッシュを 1 つ置くと、 は行末アンカーとしてではなく、リテラル文字として$認識されました。$

$行末アンカーとしての には、ある程度の知性があることに注意してください。$を正規表現の途中に置くと、正規の文字になります。

$ grep 'a$bc' <<<'a$bc'
a$bc
$ grep 'a\$bc' <<<'a$bc'
a$bc

ここでは、a$bci をエスケープしたかどうかに関係なく、リテラル文字列が見つかりました$

二重引用符で試してみました:

$ grep "abc\$" <<<'abc$'
$ grep "abc\\$" <<<'abc$'
abc$

シングルは、行末アンカーとして を\エスケープしました。$2 つ前に置くと、シェル以外のメタ文字および正規表現リテラルとして\\エスケープされます。$

于 2013-08-05T13:59:12.530 に答える
0

記号は行末$として正規表現パターンで特別な意味を持っているので、二重引用符を使用するとき

grep "c\$"

文字列を 2 文字cに展開し、 regexp 句だと$思い込んで、最後に 'c' があるすべての行を検索しますgrep

一重引用符の場合、すべての文字がそれぞれの文字として扱われます。

grep 'c\$'

コマンドにはc\およびの 3 文字が含まれ$ます。入力でこれらすべてのシンボルgrepを取得するため、エスケープ$された特別なシンボルを取得し\$ます。

于 2013-08-05T14:13:16.807 に答える
0

リテラルを検索し、エスケープ(行末を意味する)を避けfgrepたい場合は、使用することをお勧めします。$$

fgrep 'abc$' <<< 'abc$'

次の出力が得られます。

abc$

PS: fgrepと同じですgrep -Fman grep

-F, --fixed-strings PATTERN を改行で区切られた固定文字列のリストとして解釈し、そのいずれかが一致するようにします。

于 2013-08-05T14:03:51.070 に答える