regex - awk 模式匹配和允许一个歧义/不匹配的解决方案

标签 regex awk grep

我想计算文档中字符串的数量。

如果输入是:

GGTGGTGGTAT
GGTAGTGGTAT
GGTGGTGGTAT
GGTAATGGTAT

我搜索 GGTGGTGGT 我想找到 3 个匹配项。允许一种歧义。

使用 egrep 它看起来像这样并且输出为 3。
 egrep -c "GGTGGTGGT|.GTGGTGGT|G.TGGTGGT|GG.GGTGGT|GGT.GTGGT|GGTG.TGGT|GGTGG.GGT|GGTGGT.GT|GGTGGTG.T|GGTGGTGG." input

最佳答案

这是一种使用 bash 生成该正则表达式的方法:

$ patt=(GGTGGTGGT)
$ for ((i=0; i<${#patt[0]}; i++)); do 
    patt+=( "${patt[0]:0:i}.${patt[0]:i+1}" )
  done
$ regex=$(IFS='|'; echo "${patt[*]}")
$ echo "$regex"
GGTGGTGGT|.GTGGTGGT|G.TGGTGGT|GG.GGTGGT|GGT.GTGGT|GGTG.TGGT|GGTGG.GGT|GGTGGT.GT|GGTGGTG.T|GGTGGTGG.

进而:
awk -v regex="$regex" '$0 ~ regex' file

或者仅使用 awk:
awk -v srch=GGTGGTGGT '
    BEGIN {
        regex = srch
        for (i=1; i<=length(srch); i++) 
            regex = regex "|" substr(srch,1,i-1) "." substr(srch, i+1)
    }
    $0 ~ regex
' << END
GGTGGTGGTAT
GGTAGTGGTAT
GGTGGTGGTAT
GGTAATGGTAT
END
GGTGGTGGTAT
GGTAGTGGTAT
GGTGGTGGTAT

关于regex - awk 模式匹配和允许一个歧义/不匹配的解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28289363/

相关文章:

c - 使用 fgets 搜索字符和/或正则表达式

Linux 追加到文件中的单行

Bash:如何使用 sed 仅替换文件中的最后一次出现?

arrays - 数组的最后一个元素匹配 scala

c# - 什么是 "Nested Quantifier",为什么它会导致我的正则表达式失败?

regex - Perl正则表达式匹配来自磁力链接的infohash

linux - 使用 'tr' 和 'awk' 命令从 Linux 终端中的 txt 文件中删除标点符号

Linux 查找给定多个字符或字符串的文件

linux - 递归grep不同文件中的唯一模式

logging - Grep 获取来自 kubernetes 多个 pod 的特定文本