如何捕获两个字符串之间的共同字符

如何捕获两个字符串之间的共同字符

我正在比较两个字符串并捕获共同部分,例如

  • FILE0000010985.LOG
  • FILE0000010999.LOG
  • FILE0000011000.LOG

如果我比较 1 和 2,我希望输出为FILE00000109,但如果我比较 1 和 3,输出将少 2 个字符FILE000001

它捕获了我认为的公共前缀,但字符串对我来说是未知的,所以它不仅仅是使用 Bash 的子字符串匹配功能等那么简单。

答案1

纯 bash 解决方案。请注意,1 和 2 的输出是 FILE00000109,而不是 FILE0000010。

#!/bin/bash
arr=(FILE0000010985.LOG
     FILE0000010999.LOG
     FILE0000011000.LOG
    )
for (( i=0; i<${#arr[@]}; ++i )) ; do
    for (( j=i + 1; j<${#arr[@]}; ++j )) ; do
        x=${arr[i]}
        y=${arr[j]}
        p=0
        while [[ ${x:0:p} == ${y:0:p} ]] ; do 
            (( ++p ))
        done
        echo $x $y : ${x:0:p-1}
    done
done

答案2

要将每一行与从第二行开始的前一行进行比较:

awk '
    NR==1{
        split($0,U,"")
        next}
    {
        s=split($0,A,"")
        f=1
        if(length(U)>s)
            s=length(U)
        for(i=1;i<=s;i++)
            if(A[i]==U[i]&&f!=0)
                printf("%s",A[i])
            else {
                f=0
                U[i]=A[i]}
        print ""}
'

答案3

如果两个文件肯定不同,那么一种可能性是

f1=FILE0000010985.LOG
f2=FILE0000010999.LOG

for ((l=0; l<${#f1}; l++))
do [[ ${f1:0:l} != "${f2:0:l}" ]] && break
done
printf "%s\n" "${f1:0:l-1}"

(如果文件可能相同,则必须添加额外的测试。)

相关内容