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
。
grep
grep -E
答え3
存在する:
grep \*\* fileName
*
バックスラッシュはシェル(*
ワイルドカード文字)からエスケープするために使用されます。
grep
2番目のパラメータとして受け取った文字列は、2文字の文字列です**
。
正規表現として、これは次のことを意味します。任意(0個以上)のアスタリスク文字、空の文字列とも一致するので、デフォルトではどこでも一致します。これは、ファイルのすべての行を取得する理由を説明します。
正規表現*
は特別なのでgrep
しかも、そこから逃げる必要があります。*
シェルにエスケープするには、バックスラッシュの代わりに一重引用符を使用することをお勧めします。そしてバックスラッシュを使って*
grepにエスケープすることをお勧めします。この場合、二重引用符も機能しますが、バックスラッシュは依然として二重引用符内のシェルに特別であることに注意してください。
だから:
grep '\*\*' somefile.txt
(*
エスケープすると、正規表現演算子ではなくなり、リテラル文字として扱われます。)somefile.txt
2つのアスタリスク文字シーケンスを含む行が返されます。行の先頭でのみ検索するには、固定正規表現演算子を使用する必要があります^
。
grep '^\*\*' somefile.txt
正規表現演算子と見なされない別の方法は、*
文字範囲を使用することです。
grep '^[*][*]' somefile.txt
指定する別の方法二つアスタリスク文字は次のように作成されます。
grep '^\*\{2\}' somefile.txt
(他の正規表現演算子はどこにありますか?)\{
オプションを渡すときに拡張正規表現を使用すると、読みやすくなります(標準ではないので避けてください)。-E
grep
egrep
grep -E '^\*{2}' somefile.txt
(拡張正規表現では{
正規表現演算子)