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


10

文字grepを含むPCRE式で使用したいと思い<ます。Bashはリダイレクトしたいと思っていますが、リダイレクトしたくありません。どうすれば脱出でき<ますか?

回答:


11

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

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

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


5
はい、または一重引用符で
囲み

私はまだそれを学ぶ必要があります、例えばそれがエスケープでどのように正確に機能するか:grep -oP '(?< )(.*)$'たとえば単一引用符では機能しません。最初に試してみました。
hakre

@hakre正規表現に構文エラーがあるようです。もしかして(?<! )(.*)$(?<= )(.*)$
Gilles 'SO-悪をやめる'

4

2つの単純なルール:

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

したがって:

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

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

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

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.