web-dev-qa-db-ja.com

シェルのパラメーターで<または>をエスケープする方法は?

<文字を含むPCRE式でgrepを使用したいと思います。 Bashはリダイレクトしたいと思っていますが、リダイレクトしたくありません。 <をエスケープするにはどうすればよいですか?

10
hakre

私はバックスラッシュでそれを行うことができました:

25 % grep \< xmospos.c
#include        <stdio.h>
#include        <stdlib.h>
#include        <getopt.h>
#include        <X11/Xlib.h>

引用符で囲まれた、および引用符で囲まれた、バックスラッシュは、どちらも間抜けな答えを与えたよりも少ない。

11
Bruce Ediger

2つの単純なルール:

  • バックスラッシュ_\C_は、改行以外の次の文字をエスケープします。
  • 単一引用符_'text'_は、バックスラッシュを含め、それらの間の任意の文字をエスケープしますが、単一引用符は含みません(引用符で囲まれたテキストの終わりを示すため)。

したがって:

_grep -P '<html>' myfile
grep -P \<html\> myfile
grep -P '(?<!<)html' myfile
grep -P \(\?\<\!\<\) myfile
_

単一引用符を含む引数を渡す必要がある場合は、_'\''_を使用して、単一引用符内の単一引用符を「エスケープ」できます。技術的には、これによって最初のリテラルテキストが終了し、同じWordにリテラル_'_が挿入され、その後同じWordにリテラルテキストが追加されます。

_grep '^D'\''oh!' myfile
_

残りの引用ルール(要約):

  • 次の文字を少なくともいくつかの場合は引用する必要があります:空白文字と!"#$&'()*;<>?[\]^`{|}~(つまり、次の文字は安全です:文字、数字、_%+,-./:=@__および非ASCII文字)。
  • 二重引用符の間では、_"$\`_および(履歴が有効なシェルでは)_!_を除くすべての文字が文字どおりに使用されます。二重引用符の間のバックスラッシュは、非リテラル文字の前にない限り、文字列に表示されます。

これらのルールは、bashおよびその他のBourneスタイルのシェル(ashやkshなど)に対するものです。それらはzshにも適用されます(ただし、空白の後の_=_は引用符が必要な場合があります)。 csh/tcshとFishのルールは異なります。