You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 11:37:15