对反向 grep 感到困惑

对反向 grep 感到困惑

那么,当您在 grep ( egrep -v) 中使用 inverse 时,这实际上意味着输出显示颠倒(翻转)吗?

我想当我看到下面的例子时我更困惑了

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

我对 '\ ' 的作用以及如果你输入 -v 会发生什么感到困惑。另外,如果我们排除 |^$ 命令,'\' 和 '(\ )' 命令之间有什么区别?

答案1

正如冯布兰德所说,-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

现在,您发布的特定正则表达式本身并没有多大意义。你在哪里找到他们?无论如何,在许多正则表达式风格中,\ 逃脱下一个字符“\”是在许多 shell 中键入空格的一种方式。使用 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

|表示逻辑或,^匹配字符串的开头并$匹配结尾。因此,\ |^$将匹配至少包含一个空格或空行的任何行:

$ 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、任意两个字符 ( ),然后再次..匹配字符串( )。bb\1

答案2

grep pattern file(s)显示以下行匹配pattern;grep -v pattern file(s)显示执行以下操作的行不匹配模式。如果你以正确的顺序合并两者的输出,你就会得到file(s)后面的结果。

相关内容