我有 2 个文件,a.txt
我b.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 <> pqr
a.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 忽略行全为空白的更改。