![](/img/trans.png)
[英]How can I get a list of four letter words using the grep command in the Linux terminal?
[英]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.