【发布时间】:2016-03-26 10:01:56
【问题描述】:
我正在寻找一种方法来突出两个字符串之间的差异。这个想法是在终端中显示 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
最终我想自动格式化差异,以便它们被 tput 颜色代码包围,我可以回显到终端。
${str1} = 以红色突出显示,两个字符串不通用的字符
${str2} = 以青色突出显示,两个字符串不通用的字符
想要的输出:
output1="[String n${RED}â${CLS}m${RED}è™${CLS}]"
output2="[String n${CYA}a${CLS}m${CYA}e[tm]${CLS}]"
我看到的大多数差异实用程序都在行或单词级别上工作。我正在考虑为第一个差异的字节#解析 cmp 的输出,但我必须重新解析似乎有多个差异。
无论如何,我认为这似乎是一个复杂的过程,所以我只是想确保我没有遗漏明显的解决方案或工具。
现在我在想最简单的方法是格式化每个字符串以将一个字节放在一个新行上,然后我的选项就会打开。
nstr1="$(fold -w1 <<< "$(echo "${str1}")")"
nstr2="$(fold -w1 <<< "$(echo "${str2}")")"
diff <(echo -e "${nstr1}") <(echo -e "${nstr2}")
这是我所能达到的,除非我走在正确的轨道上,否则我不想走得更远。我敢肯定有无数种方法可以做到这一点,但有没有更有效的方法?
【问题讨论】:
-
我的最终目标在“想要的输出”中说明,但我想我明白你的意思。我认为展示我想如何使用差异输出是相关的,因为它可能会影响如何到达那里。我猜这个问题太宽泛了。如果您认为最好,我会删除该问题。
-
方法很清楚——解析
diff的输出并构造输出有点麻烦,但仍然比重新发明diff好。 -
希望我把问题说得更清楚一点。 @Thomas,这对我来说似乎也很“麻烦”,这就是为什么我认为我可能会忽略某些东西。
-
谢谢@Thomas Dickey。这实际上回答了我的问题。如果有更简单的方法,我只是不想先深入研究。我对我的剧本当然不是很挑剔,但似乎是一个值得学习的好项目。