【问题标题】:Linux bash command that returns where two strings differLinux bash 命令返回两个字符串不同的地方
【发布时间】:2014-10-23 09:39:50
【问题描述】:

所以,我一直在谷歌搜索,并且还搜索了有关堆栈溢出的更多详细信息,但我似乎无法找到一种简单的方法来做到这一点:

我想知道两个字符串(没有空格)的不同之处,并简单地打印出确切的区别。

例如:

Input 1 > "Chocolatecakeflavour"
Input 2 > "Chocolateflavour"

Output: "cake"

我已经尝试使用 diff 和 dwdiff、cmp 以及其他已知的 bash 命令来执行此操作,但我无法得到这个确切的结果。

有什么想法吗?

【问题讨论】:

  • 这是一个难题,取决于差异的数量和输入文本的长度。看看差异、匹配和补丁算法,它们可能会让你走上正确的道路。
  • 如果输入 1 是“foo”,输入 2 是“bar”,输出应该是什么?

标签: linux string bash command-line difference


【解决方案1】:

您可以将difffoldawk 一起使用,例如:

s="Chocolatecakeflavour"
r="Chocolateflavour"

diff <(fold -w1 <<< "$s") <(fold -w1 <<< "$r") | awk '/[<>]/{printf $2}'
cake
  • fold -w1 是将输入的字符串逐个字符分割(每行一个)
  • diff 是在两个列表中获取差异(每行 1 个字符)
  • awk '/[&lt;&gt;]/{printf $2}' 是从 diff'e 输出中抑制 &lt;&gt; 并在同一行中打印所有内容

编辑:如果字符串位于文件的不同行中,则按照下面的 OP 的 cmets 使用:

f=file
diff <(fold -w1 <(sed '2q;d' $f)) <(fold -w1 <(sed '3q;d' $f)) | awk '/[<>]/{printf $2}'
cake

【讨论】:

  • 看起来不错,但对它的工作原理进行一些解释会很有用。
  • 谢谢汤姆,我添加了一些解释。
  • 不知何故,对于我的特定需求,这并不能满足我的要求。 (虽然我不明白如何)我的输入 1 和输入 2 在文件中的不同行上,所以我使用 sed '2q;d' 和 sed '3q;d' 从文件中获取它们,如下所示:diff --normal ]/{printf $2}' 不知何故,这会返回一个 '32',这绝对不是输入字符串的一部分。
  • 你,先生,太棒了:)
  • 很高兴知道它成功了,您可以通过单击我的答案左上角的勾号将答案标记为已接受。
猜你喜欢
  • 2014-03-12
  • 2012-10-02
  • 1970-01-01
  • 1970-01-01
  • 2016-05-19
  • 1970-01-01
  • 2020-09-15
  • 1970-01-01
  • 2010-09-18
相关资源
最近更新 更多