2つ星(**)で始まる一意の行を持つファイルがあります。
ただし、grepコマンドを実行すると
grep \*\* fileName
ファイルのすべての行を取得します。これは非常に珍しく、一致しない行として**が含まれていません。
**をエスケープして正しい行を見つけるにはどうすればよいですか?
だから試してください:
egrep "^\*\*" YOUR_FILE
二重引用符を使用することを忘れないでください。
注:egrep
の代わりにgrep
を使用します。
一致する文字列が固定文字列であることを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
に:
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
(拡張正規表現では、{
が正規表現演算子です)。