如何编写egrep命令行查找变位词?解决重复字母匹配问题
查找变位词的命令解决方案
针对单词floss的变位词查找,你之前用的egrep [floss]{5}存在两个问题:一是语法不规范(缺少引号和锚定符),二是无法限制字母的重复次数——它只会匹配由f/l/o/s组成的5个字符,但允许任意重复(比如sssss或fffls这类不符合变位词要求的字符串)。
方法一:用grep管道组合实现
通过多步筛选严格匹配变位词的要求(字母完全一致、次数完全相同、长度一致):
# 从系统单词列表中查找floss的变位词 grep -E '^.{5}$' /usr/share/dict/words \ | grep '[f]' \ | grep '[l]' \ | grep '[o]' \ | grep 's.*s' \ | grep -v '[^floss]'
每一步的作用:
grep -E '^.{5}$':筛选出长度恰好为5的单词(和floss长度一致)grep '[f]'/grep '[l]'/grep '[o]':确保单词包含f、l、o各至少一次grep 's.*s':确保单词包含至少两个s(对应floss里的两个s)grep -v '[^floss]':排除包含f/l/o/s以外字母的单词
方法二:用awk实现更高效的匹配
awk可以直接统计每个字符的出现次数,一步到位完成筛选,避免多次管道调用:
awk 'length($0)==5 { split($0, chars, "") f=0; l=0; o=0; s=0; invalid=0 for (i in chars) { c=chars[i] if (c == "f") f++ else if (c == "l") l++ else if (c == "o") o++ else if (c == "s") s++ else { invalid=1; break } } if (!invalid && f==1 && l==1 && o==1 && s==2) print $0 }' /usr/share/dict/words
这个脚本会直接检查:单词长度为5,仅包含f/l/o/s,且每个字母的出现次数和floss完全一致(f:1、l:1、o:1、s:2)。
内容的提问来源于stack exchange,提问作者Tan Jing Ren
相关产品推荐
相关产品推荐

