Linux 中是否有稳定的工具(现有工具的选项/插件:vimdiff、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) 当我在分支上工作时,我想快速跳转到我的“TODO”评论。这意味着
我知道两个部分解决方案: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) 简短版本(TL;DR)
\n我有 2 个小的单行文件,看起来相同:
\n$ cat f1 f2\n./cconv.sh 100 EUR\xc2\xa0USD\n./cconv.sh 100 EUR USD\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n我曾经dhex计算过十六进制的差异。看起来 :
f1结束于c2 a0 55 53 44 0af2结束于 20 55 53 44 0a有人知道这里发生了什么事吗?有什么区别,更重要的是,它来自哪里?以下是包含这两个文件的 zip 文件的链接以及结果的屏幕截图dhex。
我过去曾尝试使用 linuxdiff命令,但没有太多运气或耐心。我通常最终会使用像 DiffMerge 或 Kdiff 这样的 GUI 实用程序。
最近我开始diff再次尝试通过 ssh 来比较远程系统上的文件,我发现这个-y / --side-by-side选项非常有用,但我仍然觉得我没有充分利用这个实用程序。
所以我很好奇如何实现以下目标:
另外,我在谷歌搜索时没有找到很多好的例子,所以如果你有一些 linux-fu 的秘密来充分利用 diff,你能分享一下吗?我将主要比较基于文本的配置文件,但任何技巧和技巧都会很棒。
供参考- DiffMerge 实用程序可以轻松地通过颜色突出显示并排显示更改。顶部的图标允许您在“显示全部”、“显示差异”和“显示与上下文的差异”视图之间切换。在命令提示符下会喜欢这些功能。
ps:我还应该指出,我认为非常有用的另一个选项是我--suppress-common-lines在这篇简洁易读的博客文章中了解到的。
我正要从它的源中区分备份以手动验证数据是否正确。一些字符,比如 åäö,在原始数据上没有正确显示,但是当客户端(通过 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) 我一直在使用 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)
周围有更好的选择吗?我不是特别喜欢那些[-,-]和{+, +}。
通常情况下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向我展示了整个文件。为什么呢?
无论如何,使用上述方法,我失去了颜色。有什么办法可以保持颜色吗?
我有一堆文件存储在各种目录中。它们是在不同时间创建的,但我需要检查它们的内容是否相同。我找不到如何对diff一个目录中的所有文件进行操作。这是可能的还是需要另一个 CLI 工具?
我想比较两个文件中的行,但为了尽量减少输出中的噪音,我只想打印行中的实际差异。
例如,给定以下两个文件:
一个.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)