如何在忽略领先空格的情况下区分2个文件


79

我有2个源文件,它们是同一事物的不同版本。但是,已经通过另一种编辑器进行了缩进更改,因此所有行在diff中的显示都不同。

是否可以使用diff命令或过滤器与diff进行比较,以便在忽略前导空格/制表符后输出仅是不同的行?

Answers:


110

diff 有一些对您有用的选项:

   -E, --ignore-tab-expansion
          ignore changes due to tab expansion

   -Z, --ignore-trailing-space
          ignore white space at line end

   -b, --ignore-space-change
          ignore changes in the amount of white space

   -w, --ignore-all-space
          ignore all white space

   -B, --ignore-blank-lines
          ignore changes whose lines are all blank

因此,diff -w old new应忽略所有空格,从而仅报告实质上不同的行。


13
值得一提的是,-w有效地从线所有空白比较之前,所以aba b被认为是相同的。我更喜欢,-b因为它忽略了空格更改,这意味着aba b被认为是不同的,但是a ba+ +多个空格+ b(对不起,mini-Markdown不允许在代码中使用多个空格!)被视为相同。
IpsRich

如何忽略所有换行符?
StackOverflowOfficial 2016年

3
我能告诉diff我们忽略像e和pi这样的先验数字的等价级数展开吗?
geneorama

@RichardWiseman好点;如果在制表符和空格之间存在混乱的情况下,除之外没有有效的组合-w-tb-tbB-t,等在一些差异全部泄漏,你更愿意忽视。-w不会,即使它也可能排除您希望看到的一些差异。
TurnipEntropy


0
diff -bB file[12]
-b, --ignore-space-change
      ignore changes in the amount of white space
-B, --ignore-blank-lines
      ignore changes whose lines are all blank

请注意,该-w选项将在差异之前忽略所有空格,因此每个文件中的this i s a line和这样的行将this is a line比较为thisisaline并且不会报告差异。

除了-w选项问题,即使-b选项也有一些小问题,并且如果出现行首,它也不会忽略空格

因此,您应该sed先删除开始时出现的空格,然后执行diff -bB。

diff -bB <(sed 's/^[ \t]*//' file1) <(sed 's/^[ \t]*//' file2)

0

我的开源Linux工具“ dif”在比较文件时忽略了包括空格在内的各种差异。

它还有许多其他选项,可用于忽略注释或时间戳,对输入文件进行排序,进行搜索/替换,忽略某些行等。

预处理输入文件后,它将在这些中间文件上运行Linux工具meld,gvimdiff,tkdiff或kompare。

不需要安装,只需从https://github.com/koknat/dif下载并运行'dif'可执行文件

要将任何空格压缩为单个空格,请使用-white选项:

dif file1 file2 -white

要删除所有空格(换行符除外),请使用-nowhite选项:

dif file1 file2 -nowhite
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.