Linux 如何找到不包含字母“的8个字母单词的数量;e‘;,使用grep命令?
我想在一些文本文件(*.txt)中查找不包含字母“e”的8个字母单词的数量。在这个过程中,我遇到了两个问题:我对量词缺乏理解,以及如何排除字符 我对Unix终端相当陌生,但这是我尝试过的:Linux 如何找到不包含字母“的8个字母单词的数量;e‘;,使用grep命令?,linux,bash,unix,grep,wc,Linux,Bash,Unix,Grep,Wc,我想在一些文本文件(*.txt)中查找不包含字母“e”的8个字母单词的数量。在这个过程中,我遇到了两个问题:我对量词缺乏理解,以及如何排除字符 我对Unix终端相当陌生,但这是我尝试过的: cat *.txt | grep -Eo "\w+" | grep -i ".*[^e].*" 我需要包含cat命令,因为它包含管道中文本文件的名称。第二个管道是将所有单词都放在一个列表中,这是可行的,但最后一个管道是用来查找所有没有字母“e”但似乎不起作用的单词。(
cat *.txt | grep -Eo "\w+" | grep -i ".*[^e].*"
我需要包含cat命令,因为它包含管道中文本文件的名称。第二个管道是将所有单词都放在一个列表中,这是可行的,但最后一个管道是用来查找所有没有字母“e”但似乎不起作用的单词。(我想,“.”表示任何字符的no或任何数字,后跟一个不是“e”的字符,后跟另一个“.”表示任何字符的no或任何数字。)
这个命令用于查找包含8个字符的单词,但它非常无效,因为我必须重复8次“[a-z]”。我想它也可以是“[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
awk
没有问题,并且假设您只想打印准确的单词,并且一行中可能有多个匹配项,如果是这种情况,可以尝试以下操作
awk -v IGNORECASE="1" '{for(i=1;i<=NF;i++){if($i~/^[a-df-z]{8}$/){print $i}}}' *.txt
注意:考虑到您只希望在行中精确匹配8个字母。8个字母加标点符号的单词将被排除在外。以下是GNU awk的一个疯狂想法:
awk 'BEGIN{FPAT="\\<\\w{8}\\>"}{c+=NF}END{print c}' file
感谢您在问题中分享您的努力,请继续。为了使问题更清晰,请您也分享您问题中的输入和预期输出示例。
[a-z]
-因此排除e
,如[a-df-z]
<代码>“[a-z]{8}”,但这似乎不起作用。我总是混淆基本正则表达式和扩展正则表达式。在普通的grep do[a-z]\{8\}
中,在grep-E
中,则{8}
将起作用。@doelie247:使用wc
而不是regex
标记将更合适,因为您不是在寻找wc
。请相应地编辑您的问题。您可以用C编写一些程序(请参阅then和…),或者在查找它们时用in-compiled by-in编写。如果您有很多文件,那么您可能也会对和感兴趣。同时阅读
awk '{for(i=1;i<=NF;i++){if(tolower($i)~/^[a-df-z]{8}$/){print $i}}}' *.txt
awk 'BEGIN{FPAT="\\<\\w{8}\\>"}{c+=NF}END{print c}' file
awk 'BEGIN{FPAT="\\<[a-df-z]{8}\\>"}{c+=NF}END{print c}' file
awk 'BEGIN{FPAT="\\<\\w{8}\\>"}{for(i=1;i<=NF;++i) if($i !~ /e/) c++}END{print c}' file