仅比较文件中的单词

仅比较文件中的单词

我有两个文件需要比较。

问题是,缩进和换行符具有不同的格式,因此仅diff file1 file2返回两个文件的整个输出。

有没有办法忽略除实际文本之外的所有内容?

答案1

diff -w忽略所有水平空白更改,这会处理缩进,但如果行已换行为不同的宽度或行在文本更改后已换行,则无济于事。

根据文本的格式,比较输出fmt可能可用,也可能不可用:

diff -u --label=file1 <(fmt file1) --label=file2 <(fmt file2)

如果可以安装的话差异,其全部目的是解决您面临的问题。它可以从 EPEL 获得。

Git 内置了此功能。它甚至可以在 Git 存储库之外运行。

git diff --word-diff file1 file2

答案2

您可以使用wdiff(“单词差异”):

$ cat file1
this is file 1, it is
two lines long
$ cat file2
this is file 2,
it is
three lines long
$ wdiff file1 file2
this is file [-1,-] {+2,+}
it is
[-two-]
{+three+} lines long
$ wdiff --no-common file1 file2

======================================================================
 [-1,-] {+2,+}
======================================================================

[-two-]
{+three+}
======================================================================`

答案3

你可以尝试一下meld,这是一个相当强大的(尽管是图形化的)文件比较工具,并且应该在 CentOS 中可用。

答案4

Diff 有多种选择:

   -i, --ignore-case
          ignore case differences in file contents

   -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

   --strip-trailing-cr
          strip trailing carriage return on input

如果单词实际上在行之间移动,那么您可以将每个输入文件缩减为单词流并比较它们。然而,这丢失了很多关于这些词的来源的上下文。这将单词表示为“字母数字字符串”,并按顺序在单词级别进行比较。

diff <( tr -cs [:alnum:] '\n' < file1 ) <( tr -cs [:alnum:] '\n' < file2 )

相关内容