那么,当您在 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)
后面的结果。