についていくつかの質問がありますgrep
。
次のコマンドが '
<Hello
' と一致するのはなぜですか?$ grep -E "\<H" test Hello World <Hello H<ello
「」のみを一致させるにはどうすればよいですか
<Hello
?
答え1
grep
文字列(正規表現)の特別な解釈を避けるには-F
(または--fixed-string
)を使用します。
$ cat test
one < two
Hello World
X<H
A <H A
I said: <Hello>
$ grep -F '<H' test
X<H
A <H A
I said: <Hello>
検索パターンを正しく引用する必要があることに注意してください。そうしないと、シェルはそれを誤って解釈する可能性があります。たとえば、grep -F <H test
代わりに実行すると、シェルは「H」というファイルを開き、それを使用して文字列「test」を検索しますgrep
。grep
次のコマンドは互いにほぼ同じですが、上記のコマンドとは異なります。
grep -F <H test
grep -F test <H # location of `<H` does not matter
grep -F H test
cat H | grep -F test # useless cat award
単語だけが一致する場合は、マンページを確認してくださいgrep(1)
。
-w, --word-regexp
Select only those lines containing matches that form whole words. The
test is that the matching substring must either be at the beginning of
the line, or preceded by a non-word constituent character. Similarly,
it must be either at the end of the line or followed by a non-word
constituent character. Word-constituent characters are letters,
digits, and the underscore.
使用例(上記のテストファイルを使用):
$ grep -F -w '<H' test
A <H A
(-F
ここでは<H
特別な意味がないのでオプションですが、このリテラルモードを拡張したい場合に便利です。)
単語の先頭を一致させるには正規表現が必要です。
$ grep -w '<H.*' test # match words starting with `<H` followed by anything
A <H A
I said: <Hello>
答え2
<
grepには特殊文字はありません。しかし、GNUではgrepは\<
特別です。単語の始まりHello
(したがって、すべての入力ラインの前には幅0の境界線があります)。
すべてgrep
の中で\
特別です。特殊文字をエスケープして特殊意味を削除したり(文字通り一致するように)、文字に特殊意味を追加することができます(通常は既存のスクリプトを壊さずに新しい演算子を導入するために使用されます。コンテンツを使用することです*?
)(?
またはANSI C \n
、\t
...などのエスケープシーケンス
削除する特別な意味は、他の\
意味と同様に別の意味が必要です\
。
したがって、一致するには<Hello
次のものが必要です。
grep -E '<Hello'
一致するには、\<Hello
次のものが必要です。
grep -E '\\<Hello'
<
そして\
両方とも特別であることに注意してください。皮をむく引用も必要ですシェル用同様に、上記の一重引用符(二重引用符\
内の他の特殊文字(改行、二重引用符、バックスラッシュ、ドル、またはバックティック)の前にのみありますが、二重引用符内のシェルにも特別なので必須またはgrep -E "\\\<Hello"
一致grep -E "\\\\<Hello"
)\<Hello
です。
パターンが行全体と一致するようにするには、-x
grepにオプションを追加します。
grep -xE '<Hello'
同じ内容の行のみが一致します"<Hello"
。
行の先頭から一致させるには:
grep -E '^<Hello'
"<Hello"
(と一致する"<Hello world>"
がWorld <Hello
。
<Hello
前のスペース以外の文字と一致しません(私の解釈は単語の先頭に):
grep -E '(^|[[:blank:]])<Hello'
またはBREを使用してください。
grep '^\(.*[[:blank:]]\)\{0,1\}<Hello'