我有以下函数来计算两个字符串之间的差异数量:
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等)也是可以接受的。我只是想避免重新发明轮子。