如何检查单词是否包含字符串bash中的所有字母

时间:2014-07-28 00:13:11

标签: string bash

假设我有一个包含单词的文件(每行一个),我有一个包含字母的字符串

str = "aeiou"

我想检查文件中有多少单词包含字符串中的所有字母。它们不必按顺序出现。 首先想到的是使用cat和grep

cat wordfile | grep a | grep e | grep i | grep letters....

这似乎有效,但我想知道是否有更好的方法。

3 个答案:

答案 0 :(得分:2)

如果修复了搜索字符串,您可以尝试这样的事情:

cat wordfile | awk '/a/&&/e/&&/i/&&/o/&&/u/' | wc -l

如果需要,可以使用您喜欢的脚本语言轻松构建搜索模式。因为我喜欢Python:

str="aeiou"
search=$(python -c 'print "/"+"/&&/".join([c for c in "'"$str"'"])+"/"')
cat wordfile | awk "$search" | wc -l

答案 1 :(得分:2)

这是一个仅在bash中完成的解决方案。注意[[]]使这个不可移植到sh。此脚本将读取文件中的每一行,然后测试它是否包含str中的每个字符。要读取的文件必须是脚本的第一个参数。以下评论描述了操作:

#!/bin/bash

str=aeiou

while read line || test -n "$line"; do    # read every line in file
    match=0;                              # initialize match = true
    for ((i=0; i<${#str}; i++)); do       # for each letter in string
        [[ $line =~ ${str:$i:1} ]] || {   # test it is contained in line - or
            match=1                       # set match false and
            break                         # break - goto next word
        }
    done 
    # if match still true, then all letters in string found in line
    test "$match" -eq 0 && echo "all found in '$line'"; 
done < "$1"

exit 0

testfile(dat / vowels.txt):

a_even_ice_dough_ball
a_even_ice_ball
someword
notallvowels

输出:

$ bash vowel.sh dat/vowels.txt
all found in 'a_even_ice_dough_ball'

答案 2 :(得分:0)

凌乱,但可以通过打开GNU grep

的PCRE-regex标志一步完成
 grep -P '^(?=.*a.*)(?=.*e.*)(?=.*i.*)(?=.*o.*)(?=.*u.*)' file | wc -l