如何使用 grep 命令找到不包含字母 "e" 的 8 个字母单词的数量?

How can I find the number of 8 letter words that do not contain the letter "e", using the grep command?

我想在多个文本文件 (*.txt) 中找出不包含字母“e”的 8 字母单词的数量。在这个过程中我运行遇到了两个问题:对量词的理解不够,以及如何排除字符。

我是 Unix 终端的新手,但这是我尝试过的:

cat *.txt | grep -Eo "\w+" | grep -i ".*[^e].*"

我需要包含 cat 命令,因为它否则会包含管道中文本文件的名称。第二个管道是把所有的单词都放在一个列表中,它起作用了,但最后一个管道是为了找到所有没有字母“e”的单词,但似乎不起作用。 (我认为“.”表示没有或任何数量的任何字符,后跟一个不是“e”的字符,然后是另一个“.”表示没有或任何数量的字符任意字符。)

cat *.txt | grep -Eo "\w+" | grep -wi "[a-z][a-z][a-z][a-z][a-z][a-z][a-z][a-z]"

这个命令可以找到包含 8 个字符的单词,但效果很差,因为我必须重复“[a-z]”8 次。我以为它也可以是“[a-z]{8}”,但那似乎不起作用。

cat *.txt | grep -Eo "\w+" | grep -wi "[a-z][a-z][a-z][a-z][a-z][a-z][a-z][a-z]" | grep -i ".*[^e].*"

所以最后,这将是我最好的猜测,但是,第三个管道无效,最后一个管道不起作用。

你可以使用这个 grep:

grep -hEiwo '[a-df-z]{8}' *.txt

这里:

  • [a-df-z]{8}:匹配除e
  • 以外的所有字母
  • -h: 不要在输出中打印文件名
  • -i: 忽略大小写搜索
  • -o:打印只匹配
  • -w:匹配完整的单词

如果您对 GNU 没问题 awk 并假设您只想打印确切的单词并且可能是一行中的多个匹配项,如果是这种情况,可以尝试以下操作。

awk -v IGNORECASE="1" '{for(i=1;i<=NF;i++){if($i~/^[a-df-z]{8}$/){print $i}}}' *.txt

或者不使用 IGNORCASE 可以尝试:

awk '{for(i=1;i<=NF;i++){if(tolower($i)~/^[a-df-z]{8}$/){print $i}}}' *.txt

注意:考虑到您只想在行中精确匹配 8 个字母。后面跟标点符号的 8 个字母的单词将被排除。

这里有一个关于 GNU awk 的疯狂想法:

awk 'BEGIN{FPAT="\<\w{8}\>"}{c+=NF}END{print c}' file

或者如果你想让它只对 select 字符集起作用:

awk 'BEGIN{FPAT="\<[a-df-z]{8}\>"}{c+=NF}END{print c}' file

它所做的是,它定义字段为一组 8 个字符(\w 作为一个词组或 [a-df-z] 作为一个 selected 集)被单词边界包围(\<\>)。这是通过 FPAT 完成的(注意 Gory details about escaping)。

有时您可能还会有包含变音的单词,因此您必须扩展。那么这可能是最好的解决方案:

awk 'BEGIN{FPAT="\<\w{8}\>"}{for(i=1;i<=NF;++i) if($i !~ /e/) c++}END{print c}' file