差异没有按我的预期工作

差异没有按我的预期工作

我有 2 个文件,a.txtb.txt想比较它们。

a.txt包含:

abc
jkl < jkl
mno > mno
pqr <> pqr

b.txt包含:

abc
jkl < jkl
mno > mno
pqr <> pqrs
stu

我正在使用这个脚本:

$ diff a.txt b.txt | grep "> " | cut -c3- > c.txt

结果是c.txt

pqr <> pqr
pqr <> pqrs
stu

为什么会pqr <> pqr被包含在结果中?我该如何解决这个问题?

答案1

正如 @StephaneChazelas 指出的,您忘记锚定正则表达式,因此将"> "匹配仅>在.pqr <> pqra.txt

但看起来您希望过滤器仅显示 中新增或更改的行b.txt。如果您使用 GNU diff,它会为您提供一些选项来直接实现此目的:

$ diff --old-line-format '' --unchanged-line-format '' --new-line-format '%L' a.txt b.txt 
pqr <> pqrs
stu

删除--old-line-format ''所有不在 中的行b.txt--unchanged-line-format ''删除两个文件共有的所有行,--new-line-format '%L'只显示 中所有新行或更改行的行内容b.txt。领先>被压制。

答案2

正如 @StephaneChazelas 在评论中所述,这似乎与 SSH 无关。在本地运行所有内容我得到与您相同的结果,主要是:

$ diff a.txt b.txt | grep "> " | cut -c3-
pqr <> pqr
pqr <> pqrs
stu

diff命令识别不同的行,并且该行在pqr <> pqrs两个文件中是唯一的。如果有帮助,您可以使用并排差异来查看哪些行对齐。

$ diff -y a.txt b.txt
abc                                                             abc
jkl < jkl                                                       jkl < jkl
mno > mno                                                       mno > mno
pqr <> pqr                                                    | pqr <> pqrs
                                                              > stu

相似但不相同的行用 标记|。唯一的行标有“ >if only in file #2”(仅出现在文件#2 中)或“ <if only contains in file #1”(如果仅出现在文件#1 中)。相同的线条不显示任何此类标记。

答案3

也许你有多余的空白。

尝试

diff -w -B file1.txt file2.txt

-w 忽略所有空白。

-B 忽略行全为空白的更改。

相关内容