【发布时间】:2018-03-01 04:10:00
【问题描述】:
所以我想出了两个命令:
1:grep -c [^[^aeiouAEIOU]] filename.txt;结果:52331
2:grep -v -c [^aeiouAEIOU] filename.txt;结果:52333
这两个命令对我来说是相同的,但结果不同。
请帮忙,这对我来说毫无意义。
【问题讨论】:
所以我想出了两个命令:
1:grep -c [^[^aeiouAEIOU]] filename.txt;结果:52331
2:grep -v -c [^aeiouAEIOU] filename.txt;结果:52333
这两个命令对我来说是相同的,但结果不同。
请帮忙,这对我来说毫无意义。
【问题讨论】:
这两个命令确实做了不同的事情,而且它们都没有真正按照你的想法做:
grep -c [^[^aeiouAEIOU]] filename.txt
你不能真正嵌套[^...] 表达式。相反,这个正则表达式被解释为[^[^aeiouAEIOU] 与] 连接。也就是说,它将匹配行中任何不是[、^ 或元音字母和] 的字符组合。例如,这些字符串将匹配:b]、c]、#]、;];而这些不会:a]、E]、c、d。而“anywhere in the line”是指上面的grep命令会统计aaab]、i uc]等行数。
至于你的第二条命令,
grep -v -c [^aeiouAEIOU] filename.txt
这里有双重否定。首先,[^aeiouAEIOU] 匹配除元音以外的任何字符。另一方面,传递给grep 的-v 选项会反转匹配,因此它将匹配任何与[^aeiouAEIOU] 不匹配的行。最终效果基本上是您告诉grep:“计算除aeiouAEIOU 之外没有符号的所有行”。也就是说,它将只计算仅包含元音的行。
实际上应该给出不以元音开头的行数的两个命令是:
grep -c ^[^aeiouAEIOU] filename.txt
grep -v -c ^[aeiouAEIOU] filename.txt
【讨论】:
你也可以试试这个:
grep -Ewcv "*[aeiou]*" filename.txt
【讨论】: