正規表現とGrepを使用して*エスケープ

正規表現とGrepを使用して*エスケープ

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

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

grep \*\* fileName 

ファイルのすべての行を取得します。これは非常にまれです。私が見た一致しない行に**は含まれていません。

正しい行を見つけるために**をどのように逃げますか?

答え1

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 し、次の結果を生成します。

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

答え2

だから試してみてください:

egrep "^\*\*" YOUR_FILE

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

メモ:egrep代わりに使用するにはを使用してくださいgrep
grepgrep -E

答え3

存在する:

grep \*\* fileName

*バックスラッシュはシェル(*ワイルドカード文字)からエスケープするために使用されます。

grep2番目のパラメータとして受け取った文字列は、2文字の文字列です**

正規表現として、これは次のことを意味します。任意(0個以上)のアスタリスク文字、空の文字列とも一致するので、デフォルトではどこでも一致します。これは、ファイルのすべての行を取得する理由を説明します。

正規表現*は特別なのでgrepしかも、そこから逃げる必要があります。*シェルにエスケープするには、バックスラッシュの代わりに一重引用符を使用することをお勧めします。そしてバックスラッシュを使って*grepにエスケープすることをお勧めします。この場合、二重引用符も機能しますが、バックスラッシュは依然として二重引用符内のシェルに特別であることに注意してください。

だから:

grep '\*\*' somefile.txt

*エスケープすると、正規表現演算子ではなくなり、リテラル文字として扱われます。)somefile.txt2つのアスタリスク文字シーケンスを含む行が返されます。行の先頭でのみ検索するには、固定正規表現演算子を使用する必要があります^

grep '^\*\*' somefile.txt

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

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

指定する別の方法二つアスタリスク文字は次のように作成されます。

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

(他の正規表現演算子はどこにありますか?)\{オプションを渡すときに拡張正規表現を使用すると、読みやすくなります(標準ではないので避けてください)。-Egrepegrep

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

(拡張正規表現では{正規表現演算子)

関連情報