各単語の先頭にある特殊文字と一致するようにgrepに指示する方法

各単語の先頭にある特殊文字と一致するようにgrepに指示する方法

についていくつかの質問がありますgrep

  1. 次のコマンドが ' <Hello' と一致するのはなぜですか?

    $ grep -E "\<H" test
    Hello World
    <Hello
    H<ello
    
  2. 「」のみを一致させるにはどうすればよいですか<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」を検索しますgrepgrep次のコマンドは互いにほぼ同じですが、上記のコマンドとは異なります。

 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です。

パターンが行全体と一致するようにするには、-xgrepにオプションを追加します。

grep -xE '<Hello'

同じ内容の行のみが一致します"<Hello"

行の先頭から一致させるには:

grep -E '^<Hello'

"<Hello"(と一致する"<Hello world>"World <Hello

<Hello前のスペース以外の文字と一致しません(私の解釈は単語の先頭に):

grep -E '(^|[[:blank:]])<Hello'

またはBREを使用してください。

grep '^\(.*[[:blank:]]\)\{0,1\}<Hello'

関連情報