我有两个文件,当我用 diff 比较时,显示每一行都发生了变化。当我用 (忽略空格) 比较它们时,diff -w
它显示了我期望的几个最小变化。
显然,每个文件中的空格都有所不同,但我不知道它们是什么或如何找到它们。我尝试编辑文件以确保空格实际上是空格字符(而不是制表符),但不确定还能做什么。
我已经使用 vim 来:set list on
确认行尾没有尾随空格。
我还相信每个文件都有 Linux 行终止符,因为 vim 没有^M
在行尾显示。
答案1
对于vim
用户来说,有一个方便的实用程序可以显示文件之间的确切差异:
vimdiff file1 file2
这会将每个文件并排放置在窗口中,并用颜色突出显示差异。
一些有用的命令vimdiff
在 中vimdiff
,一些有用的命令是:
]c
:跳转到下一个更改[c
:跳转到上一个修改ctrl-W ctrl-W
:切换到其他窗口zo
:打开折叠zc
:关闭折叠
例子
vimdiff
以下是比较配置文件xterm
两个版本的示例cups
:
您可以看到长段相同的行已被折叠。可以使用 重新打开它们zo
。
配色方案将根据您的选项设置而有所不同。在上面的例子中,当一行出现在一个文件中而另一个文件中没有出现时,该行的背景为深蓝色背景。在另一个文件中,缺失的行用虚线表示。当一行出现在两个文件中但存在一些差异时,行中未改变的部分的背景为粉红色,而改变的部分的背景为红色。
答案2
在 FreeBSD 或大多数 Linux 系统上,您可以通过管道传输 diff 的输出cat -v -e -t
来显示空格差异。
diff file1 file2 | cat -vet
制表符将显示为^I
,$
每行末尾将显示 ,以便您可以看到尾随空格,非打印字符将显示为^X
或M-X
。
如果你有 GNU coreutils(在大多数非 busybox Linux 发行版上可用),这可以简化为
diff file1 file2 | cat -A
在 busybox 系统上,使用catv -vet
。
答案3
要找出真正的空格和制表符在哪里,你可以使用sed
以下方法替换它们:
$ cat file
line 1
line 2
line 6
line 7
$ sed 's/ /-/g; s/\t/<tab>/g' file
--line-1
--line-2
<tab>line-6
<tab><tab>line-7
现在比较这两个文件。
答案4
od
可能会有所帮助。 Octal Dump 命令可以显示十六进制的内容。这可以帮助您查看文件中的字节,包括空字节或意外的空格。可能的常见原因可能是 LF 与 CRLF、制表符与空格或 ASCII 与 Unicode(通常可能在每个正常可见的字节之前只有一个空字节)。 od -x filename
应该揭示任何这些模式。如果您想要一种更复杂的方式来查看文件,任何“十六进制编辑器”都可以很好地完成。好处是od
,像cut
命令一样,它内置于许多 Unix 系统中。因此,通常不需要单独安装。
如果您需要文件更相似,tr
可以进行一些更改,并且sed
可以进行更多更改。我可能会先ls -l
查看哪个文件较大,然后查看字节以查看需要更改的内容,然后更改其中一个文件,使它们看起来更相似。