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

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

grepその文字を含むPCRE式で使用したいです<。 Bashは私がリダイレクトしたいと思いますが、そうではありません。どうやって逃げますか<

答え1

バックスラッシュを使用してこれを行うことができます。

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

引用された「遅い」記号と引用されたバックスラッシュの「遅い」記号の両方は、愚かな答えを提供します。

答え2

2つの簡単なルール:

  • バックスラッシュは\C改行文字を除いて次の文字をエスケープします。
  • 一重引用符は'text'バックスラッシュを含むそれらの間のすべての文字をエスケープしますが、一重引用符はエスケープされません(引用符付きテキストの終わりを示すため)。

したがって:

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

'\''一重引用符を含むパラメータを渡す必要がある場合は、一重引用符内の一重引用符を「エスケープ」する方法を使用できます。技術的にこれが行うことは、最初のリテラルテキストを終了してリテラルを'同じ単語に入れてから、より多くのリテラルテキストを同じ単語に入れることです。

grep '^D'\''oh!' myfile

残りの引用規則(要約):

  • !"#$&'()*;<>?[\]^`{|}~スペースと文字(つまり、文字、数字、および%+,-./:=@_ASCII以外の文字)は、少なくともある程度引用する必要があります。
  • 二重引用符の間におよびを除くすべての文字は文字通り使用されます"$\`(書き込み可能シェルから)!。リテラル以外の文字の1つの前に来ないと、二重引用符の間のバックスラッシュが文字列に表示されます。

これらのルールは、bashや他のBourneスタイルのシェル(ashやkshなど)に適用されます。また、zshでも機能します(=スペースの後に引用符があることを除く)。 csh/tcsh と Fish ではルールが異なります。

関連情報