逆方向grepについて混乱

逆方向grepについて混乱

もしそうなら、grep()でinverseを使用すると、egrep -v実際に出力が逆さまに(反転)表示されることを意味しますか?

以下の例を見ると、さらに混乱していたと思います。

$ egrep -v '\ ' blah.sh
$ egrep -v '(\ )|^$' blah.sh

'\'の機能と-vを入力すると、何が起こるのか混乱します。また、 |^$ コマンドを除いて、 '\' コマンドと '(\ )' コマンドの違いは何ですか?

答え1

von Brandが言ったように、-vこのパターンと一致しない線を印刷することを意味します。これは例によって最もよく説明されています。というファイルがあり、foo.txtその内容は次のようであるとしましょう。

aaa
bbb
aabb

grepそれでは、このファイルにいくつかの文字列を入力してみましょう。

$ egrep 'a' foo.txt ## print lines that contain 'a'
aaa
aabb
$ egrep -v 'a' foo.txt  ## print lines that do not contain 'a'
bbb

今、あなたが投稿した特定の正規表現はそれ自体では意味がありません。どこで見つけることができますか?とにかく、多くの正規表現で\ 脱出する次の文字「\」は、多くのシェルでスペースを入力する方法です。これはGNUを使用するためには必要ありませんが、grepスペース'\ 'を見つけることを意味します。たとえば、

$ cat foo.txt
aaa
bb cc
$ grep '\ ' foo.txt
bb cc
$ grep ' ' foo.txt # same as the previous one, at least for GNU grep
bb cc
$ grep -v '\ ' foo.txt # print lines that do not contain spaces
aaa

|^文字列の先頭と$末尾を一致させる論理ORを表します。したがって、\ |^$少なくとも1つの空白または空白行を含むすべての行は一致します。

$ cat foo.txt
aaa

bbb
cc dd
$ egrep '\ |^$' foo.txt # print lines that are either empty, or have spaces

dd ee
$ egrep -v '\ |^$' foo.txt # print lines that are neither empty, nor have spaces
aaa 
bbb

括弧を使用すると、パターンをキャプチャできます。

   Back References and Subexpressions
       The back-reference \n, where n is a single digit, matches  the
       substring   previously   matched   by  the  nth  parenthesized
       subexpression of the regular expression.

公開した正規表現では役に立つことはありません。使用法の例は次のとおりです。

$ cat foo.txt
aaaa
aa bb

aabbccbb
$ egrep '(bb)..\1' foo.txt  
aabbccbb

正規表現は、(bb)..\1文字列bb、任意の2文字()を一致させ、..文字列を再一致させる()を意味します。bb\1

答え2

grep pattern file(s)次の行を表示マッチこれは、以下を実行する行を示していますpatterngrep -v pattern file(s)矛盾モデル。両方の出力を正しい順序でマージすると、file(s)後者の結果が得られます。

関連情報