突出显示字符串差异

时间:2015-12-20 00:38:15

标签: bash shell colors diff

我正在寻找一种方法来突出2个字符串之间的差异。这个想法是在终端中显示iconv改变了哪些字符。已经处理了这两个字符串以删除前导和尾随空格,但必须处理内部空格。

RED="$(tput setaf 1)"    ##    Short variables for the tput ->
CYA="$(tput setaf 6)"    ## -> commands to make output strings ->
CLS="$(tput sgr0)"       ## -> easier to read
str1="[String nâmè™]"    # String prior to iconv
str2="[String name[tm]]" # String after iconv -f utf-8 -t ascii//translit

最终我想自动化差异的格式化,以便它们被我可以回显到终端的输出颜色代码包围。

${str1} =突出显示红色,两个字符串不共有的字符

${str2} =以青色突出显示,两个字符串不共有的字符

通缉输出:

output1="[String n${RED}â${CLS}m${RED}è™${CLS}]"
output2="[String n${CYA}a${CLS}m${CYA}e[tm]${CLS}]"

我看到的大多数diff工具都是在行或字级别上工作的。我正在考虑解析第一个diff的字节#的cmp输出,但是我必须重新解析它看起来的多个差异。

无论如何,我想一想,它似乎是一个涉及的过程,所以我只是想确保我没有错过一个明显的解决方案或工具。

现在,我认为最简单的方法是格式化每个字符串,将一个字节放在一个新行上,然后打开我的选项。

nstr1="$(fold -w1 <<< "$(echo "${str1}")")"
nstr2="$(fold -w1 <<< "$(echo "${str2}")")"
diff <(echo -e "${nstr1}") <(echo -e "${nstr2}")

这是我得到的,除非我走在正确的轨道上,否则我不想走得更远。我确定有很多方法可以做到这一点但是有更有效的方式去这里吗?

1 个答案:

答案 0 :(得分:1)

@Thomas Dickey在评论中提供的答案表明,没有任何工具或流程比我尝试它的方式容易得多。

为了完成,我能够产生&#34; 通缉输出&#34;使用以下diff行足够简单。

diff --changed-group-format="\${RED}%=\${CLS}" <(echo -e "${nstr1}") <(echo -e "${nstr2}")|tr -d '\n'
diff --changed-group-format="\${CYA}%>\${CLS}" <(echo -e "${nstr1}") <(echo -e "${nstr2}")|tr -d '\n'

不幸的是,我还没有想出如何回应输出以解释颜色代码,但这是另一个问题。