比较两个仅略有差异的字符串

时间:2017-02-24 20:20:09

标签: string bash

我有以下函数来计算两个字符串之间的差异数量:

get_num_diffs_strict() {
    local -i diffs=$(cmp -l <(echo "$1") <(echo "$2") 2>/dev/null | wc -l)

    local -i lendiff=0
    if (( ${#1} > ${#2} ));then
        lendiff=$((${#1} - ${#2}))
    else
        lendiff=$((${#2} - ${#1}))
    fi

    if (( lendiff > 0 ));then # lines differ in length
        (( lendiff-- )) # subtract already accounted EOF character
        (( diffs+=lendiff ))
    fi

    echo $diffs
}

对于像

这样的输入
$ get_num_diffs_strict hello somethingelse
$ 13
$ get_num_diffs_strict hello holla
$ 2

结果是可以接受的。 对于其他输入字符串,我希望它不那么严格,视为差异。考虑以下情况

$ get_num_diffs_strict hello helo
$ 2
$ get_num_diffs_strict hello heello
$ 3
$ get_num_diffs_strict 0123456789 0123567889
$ 4

然而,所需的输出在前两种情况下应为1,在最后一种情况下应为2。 在案例1和案例2中,只有一个字母缺失或只有一个字母。它应该算作一个区别。在最后一种情况下,第二个字符串缺少数字4并且包含数字8两次。这些只应该算作两个差异 - 就像人类会直观地看到它一样。

是否有任何类似于cmp的程序可以实现这一目标?替代解决方案(python,perl等)也是可以接受的。我只是想避免重新发明轮子。

0 个答案:

没有答案