web-dev-qa-db-ja.com

エスケープ*正規表現とGrep

2つ星(**)で始まる一意の行を持つファイルがあります。

ただし、grepコマンドを実行すると

grep \*\* fileName 

ファイルのすべての行を取得します。これは非常に珍しく、一致しない行として**が含まれていません。

**をエスケープして正しい行を見つけるにはどうすればよいですか?

5
monksy

だから試してください:

egrep "^\*\*" YOUR_FILE

二重引用符を使用することを忘れないでください。

注:egrepの代わりにgrepを使用します。

6
PersianGulf

一致する文字列が固定文字列であることをgrepに指示することで、同じことを実現することもできます。これを行うスイッチは-Fまたは--fixed-strings

-F, --fixed-strings
          Interpret  PATTERN  as  a  list of fixed strings, separated by 
          newlines, any of which is to be matched.  (-F is specified by
          POSIX.)

したがって、このようなものはそれを行います:

$ grep -F "**" somefile.txt

$ cat somefile.txt
** blah
blahblah
** hi

ファイルをグレッピングすると、次のようになります。

$ grep -F "**" somefile.txt
** blah
** hi
7
slm

に:

grep \*\* fileName

円記号は、シェルで*をエスケープするために使用されます(*はグロブ演算子です)。

grepが2番目の引数として受け取るものは、2つの文字列**です。

正規表現として、それは任意の(0以上)のスター文字を意味します。したがって、ファイルのすべての行を取得する理由を説明する空の文字列にも一致するため、基本的にどこにでも一致します。

*grep regex 同様にに固有であるため、そこでもエスケープする必要があります。バックスラッシュの代わりに一重引用符を使用して*をシェルにエスケープし(一重引用符はすべての文字をエスケープする強力なシェル引用符であるため)、バックスラッシュを使用して*をエスケープします。 grep。その場合、二重引用符も機能しますが、二重引用符内のバックスラッシュはシェルにとって特別であることに注意してください。

そう:

grep '\*\*' somefile.txt

*はエスケープされているため、正規表現演算子ではなくリテラル文字と見なされます)は、2つ星の文字のシーケンスを含むsomefile.txtの行を返します。それらを行の先頭にのみ見つけたい場合は、アンカー正規表現演算子^を使用する必要があります。

grep '^\*\*' somefile.txt

*を正規表現演算子として解釈しない別の方法は、文字範囲を使用することです。

grep '^[*][*]' somefile.txt

twoスター文字を指定する別の方法は、次のように記述することです。

grep '^\*\{2\}' somefile.txt

(ここで\{は別の正規表現演算子です)-Eオプションをgrepに渡すときのように拡張正規表現を使用すると読みやすくなります(egrepをそのまま使用しないでください)標準ではありません):

grep -E '^\*{2}' somefile.txt

(拡張正規表現では、{が正規表現演算子です)。

6