繁体   English   中英

如何使用 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 个字符的单词,但它非常无效,因为我必须重复 "[az]" 8 次。 我认为它也可能是“[az]{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

或者,如果您只想使其仅适用于一组选定的字符:

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

它的作用是,它将字段定义为一组 8 个字符( \\w作为单词组成部分或[a-df-z]作为选定集),由单词边界( \\<\\> )。 这是通过FPAT完成的(注意有关 escaping 的FPAT 细节)。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM