<
文字を含むPCRE式でgrep
を使用したいと思います。 Bashはリダイレクトしたいと思っていますが、リダイレクトしたくありません。 <
をエスケープするにはどうすればよいですか?
私はバックスラッシュでそれを行うことができました:
25 % grep \< xmospos.c
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
#include <X11/Xlib.h>
引用符で囲まれた、および引用符で囲まれた、バックスラッシュは、どちらも間抜けな答えを与えたよりも少ない。
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のルールは異なります。