假设我有一个包含单词的文件(每行一个),我有一个包含字母的字符串
str = "aeiou"
我想检查文件中有多少单词包含字符串中的所有字母。它们不必按顺序出现。 首先想到的是使用cat和grep
cat wordfile | grep a | grep e | grep i | grep letters....
这似乎有效,但我想知道是否有更好的方法。
答案 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
grep -P '^(?=.*a.*)(?=.*e.*)(?=.*i.*)(?=.*o.*)(?=.*u.*)' file | wc -l