标签: diff

不同的性格

Linux 中是否有稳定的工具(现有工具的选项/插件:vimdiff、diff 等)来按字符在两个文本文件之间进行区分?

我想看到我的两个文件之间最长的公共子序列突出显示。有一个经典的多项式时间算法,但标准工具似乎只能逐行工作。

diff file-comparison vimdiff

10
推荐指数
1
解决办法
937
查看次数

diff - 如何忽略空行

我需要区分两个文件,忽略所有空格和空/空白行,但由于某些原因,我发现 diff 选项做得并不好,它一直显示 file1 中的空行...

$ cat file1
2 nodes configured
13 resources configured

$ cat file2
2 nodes configured
23 resources configured
$ diff -ywBEZb -W 200 --suppress-blank-empty --suppress-common-lines file1 file2
13 resources configured                                                                            |    23 resources configured
                                                                                                   <
$ od -bc file1
0000000 062 040 156 157 144 145 163 040 143 157 156 146 151 147 165 162
          2       n   o   d   e   s       c   o   n   f   i   g   u   r
0000020 145 144 012 061 …
Run Code Online (Sandbox Code Playgroud)

linux diff

10
推荐指数
1
解决办法
1万
查看次数

grep 在 git diff 中,但显示文件和行号

当我在分支上工作时,我想快速跳转到我的“TODO”评论。这意味着

  1. 我只想要添加到我的分支上的“TODO”注释(忽略 master 中的注释)
  2. 我希望每个匹配项都显示文件和行号。

我知道两个部分解决方案:git grep TODO具有正确的格式(将 grep.lineNumber 设置为 true),但结果太多。 git diff master... | grep TODO是一组很好的结果,但不显示文件和行号。

是否有一个选项可以告诉git diff每个更改的行添加文件名和行号前缀?(--line-prefix看起来很有希望,但似乎只需要一个固定的字符串。)

我可以通过--new-line-format=":%dn: %L"diff - 输出行号)吗git diff


例如,目前我的搜索结果如下所示:

$ git diff master... | grep TODO
+    // TODO use a non-fatal assertion
+        // TODO use a non-fatal assertion
+// TODO make this conditional too
Run Code Online (Sandbox Code Playgroud)

但理想情况下我想要这样:

src/foo/abc.cpp:221:+    // TODO use a non-fatal assertion
src/foo/xyz.cpp:934:+        // TODO use a non-fatal assertion …
Run Code Online (Sandbox Code Playgroud)

diff git

10
推荐指数
1
解决办法
3421
查看次数

shell 脚本未将空格用作参数分隔符(有人可以解释一下这个小文件差异吗?)

简短版本(TL;DR)

\n

我有 2 个小的单行文件,看起来相同:

\n
$ cat f1 f2\n./cconv.sh 100 EUR\xc2\xa0USD\n./cconv.sh 100 EUR USD\n
Run Code Online (Sandbox Code Playgroud)\n

但它们不是,大小有 1 个字节的差异:

\n
$ ls -l f1 f2\n(...) 24 oct.  30 16:19 f1\n(...) 23 oct.  30 16:19 f2\n\n$ diff f1 f2\n1c1\n< ./cconv.sh 100 EUR\xc2\xa0USD\n---\n> ./cconv.sh 100 EUR USD\n
Run Code Online (Sandbox Code Playgroud)\n

我曾经dhex计算过十六进制的差异。看起来 :

\n
    \n
  • f1结束于c2 a0 55 53 44 0a
  • \n
  • f2结束于 20 55 53 44 0a
  • \n
\n

有人知道这里发生了什么事吗?有什么区别,更重要的是,它来自哪里?以下是包含这两个文件的 zip 文件的链接以及结果的屏幕截图dhex

\n …

diff shell-script arguments hex

10
推荐指数
1
解决办法
1049
查看次数

如何使用“diff”命令获得最大收益?

我过去曾尝试使用 linuxdiff命令,但没有太多运气或耐心。我通常最终会使用像 DiffMerge 或 Kdiff 这样的 GUI 实用程序。

最近我开始diff再次尝试通过 ssh 来比较远程系统上的文件,我发现这个-y / --side-by-side选项非常有用,但我仍然觉得我没有充分利用这个实用程序。

所以我很好奇如何实现以下目标:

  1. 突出显示更改或使用颜色编码使输出更具可读性
  2. 合并 - 选择有差异的行并将更改影响到文件之一

另外,我在谷歌搜索时没有找到很多好的例子,所以如果你有一些 linux-fu 的秘密来充分利用 diff,你能分享一下吗?我将主要比较基于文本的配置文件,但任何技巧和技巧都会很棒。

供参考- DiffMerge 实用程序可以轻松地通过颜色突出显示并排显示更改。顶部的图标允许您在“显示全部”、“显示差异”和“显示与上下文的差异”视图之间切换。在命令提示符下会喜欢这些功能。

ps:我还应该指出,我认为非常有用的另一个选项是我--suppress-common-lines在这篇简洁易读的博客文章中了解到

command-line diff

9
推荐指数
2
解决办法
3067
查看次数

由于编码问题,相同的文件,不同的文件名?

我正要从它的源中区分备份以手动验证数据是否正确。一些字符,比如 åäö,在原始数据上没有正确显示,但是当客户端(通过 samba)正确解释它时,没有什么可担心的。从备份恢复的数据正确显示字符,导致差异不认为它们是相同的文件(有差异,而是完全不同的文件)。

md5 sums,相同的文件但不同的名称。

# md5sum /original/iStock_000003637083Large-barn*
e37c34968dd145a0e25692e1cb7fbdb1  /original/iStock_000003637083Large-barn p? strand.jpg

# md5sum /frombackup/iStock_000003637083Large-barn*
e37c34968dd145a0e25692e1cb7fbdb1  /frombackup/iStock_000003637083Large-barn på strand.jpg
Run Code Online (Sandbox Code Playgroud)

挂载选项和文件系统

/dev/sdb1 on /original type ext4 (rw,noatime,errors=remount-ro)
/dev/sdc1 on /frombackup type ext4 (rw)
Run Code Online (Sandbox Code Playgroud)

语言环境

LANG=sv_SE.UTF-8
LANGUAGE=
LC_CTYPE="sv_SE.UTF-8"
LC_NUMERIC="sv_SE.UTF-8"
LC_TIME="sv_SE.UTF-8"
LC_COLLATE="sv_SE.UTF-8"
LC_MONETARY="sv_SE.UTF-8"
LC_MESSAGES="sv_SE.UTF-8"
LC_PAPER="sv_SE.UTF-8"
LC_NAME="sv_SE.UTF-8"
LC_ADDRESS="sv_SE.UTF-8"
LC_TELEPHONE="sv_SE.UTF-8"
LC_MEASUREMENT="sv_SE.UTF-8"
LC_IDENTIFICATION="sv_SE.UTF-8"
LC_ALL=
Run Code Online (Sandbox Code Playgroud)

od -c

# ls "/original/iStock_000003637083Large-barn p? strand.jpg" | od -c
0000000   /   v   a   r   /   w   w   w   /   m   e   d   i   a   b   a
0000020   n   k   e   n …
Run Code Online (Sandbox Code Playgroud)

linux diff character-encoding

9
推荐指数
1
解决办法
3781
查看次数

像 git 一样的彩色单词差异?

我一直在使用 git 的(彩色)--word-diff,我觉得它很棒。我今天发现自己处于一种情况,我需要一个字一个字地比较两个字符串,并渴望像 git 的 diff 这样的东西。

我知道wdiff+ colordiff,但它的结果肯定不是很好:

me@me:~$ wdiff <(echo -e "abc\ndef") <(echo -e "dbcx\ndef") | colordiff
[-abc-]{+dbcx+}
def
Run Code Online (Sandbox Code Playgroud)

周围有更好的选择吗?我不是特别喜欢那些[-,-]{+, +}

colors diff git colordiff

9
推荐指数
1
解决办法
2733
查看次数

diff 仅显示已更改文件中的添加项

通常情况下diff,并git diff同时显示原始的和与修改后的行-+分别。有什么办法,我只能过滤才能看到修改后的行吗?这将立即将要读取的行数减少 2 倍。

我假设

git diff test.yml | grep '^+' | less -R
Run Code Online (Sandbox Code Playgroud)

git diff test.yml | egrep '^+' | less -R
Run Code Online (Sandbox Code Playgroud)

有相同的结果。即他们会在文件中显示任何新添加的内容。但是egrep向我展示了整个文件。为什么呢?

无论如何,使用上述方法,我失去了颜色。有什么办法可以保持颜色吗?

grep diff git

9
推荐指数
2
解决办法
1万
查看次数

你能区分一个目录中的所有文件吗?

我有一堆文件存储在各种目录中。它们是在不同时间创建的,但我需要检查它们的内容是否相同。我找不到如何对diff一个目录中的所有文件进行操作。这是可能的还是需要另一个 CLI 工具?

command-line diff files

9
推荐指数
2
解决办法
1万
查看次数

diff 仅显示行内的差异

我想比较两个文件中的行,但为了尽量减少输出中的噪音,我只想打印行中的实际差异。

例如,给定以下两个文件:

一个.txt

a b c d e f g h i j k l m n o p q r s t u v w x y z
Run Code Online (Sandbox Code Playgroud)

b.txt

a B c d e f g h i j k l m n o p q r s t u v w x y z
Run Code Online (Sandbox Code Playgroud)

(它们之间的区别是字母的大小写b

我希望输出类似于:

[-b-]{+B+}
Run Code Online (Sandbox Code Playgroud)

目前,我发现的最佳方法是使用git diff --word-diff,但它输出整行:

a [-b-]{+B+} c d e f g h i j k l m n …
Run Code Online (Sandbox Code Playgroud)

diff shell-script

9
推荐指数
1
解决办法
3306
查看次数