如何在linux中获得两个文件之间的差异(仅添加内容)
我有两个文件A1和A2(未排序)。A1是A2的早期版本,A2中添加了一些行。如何获取添加到A2的新行 注意:我只希望添加新行,不希望A1中的行在A2中删除。当我执行如何在linux中获得两个文件之间的差异(仅添加内容),linux,bash,diff,Linux,Bash,Diff,我有两个文件A1和A2(未排序)。A1是A2的早期版本,A2中添加了一些行。如何获取添加到A2的新行 注意:我只希望添加新行,不希望A1中的行在A2中删除。当我执行diff A1 A2时,我会得到添加和删除,但我只需要添加 请建议执行此操作的方法。diff,然后为所需的编辑类型提供grep diff -u A1 A2 | grep -E "^\+" 简单的方法是使用: sdiff A1 A2 另一种方法是使用comm,如您在中所见,您可以键入: grep -v -f A1 A2 你可以试试
diff A1 A2
时,我会得到添加和删除,但我只需要添加
请建议执行此操作的方法。
diff
,然后为所需的编辑类型提供grep
diff -u A1 A2 | grep -E "^\+"
简单的方法是使用:
sdiff A1 A2
另一种方法是使用comm
,如您在中所见,您可以键入:
grep -v -f A1 A2
你可以试试这个
diff --changed-group-format='%>' --unchanged-group-format='' A1 A2
这些选项记录在man diff
中:
--GTYPE-group-format=GFMT
format GTYPE input groups with GFMT
以及:
以及:
GFMT(仅限)可能包含:
%<文件1中的行
%>文件2中的行
[...]
以下所有内容均直接从@TomOnTime的服务器故障答案中复制:
显示仅存在于文件a中的行:(即从文件a中删除的内容)
显示仅存在于文件b中的行:(即添加到b中的内容)
显示仅存在于一个或另一个文件中的行:(但不能同时存在于两个文件中)
(警告:如果文件a
的行以TAB开头,则它(第一个选项卡)将从输出中删除。)
注意:两个文件都需要排序,以便“comm”正常工作。如果尚未对其进行排序,则应对其进行排序:
sort <a >a.sorted
sort <b >b.sorted
comm -12 a.sorted b.sorted
排序a.sorted
排序
通信-12 a.已排序b.已排序
如果文件非常长,这可能是一个相当大的负担,因为它需要额外的副本,因此需要两倍的磁盘空间
编辑:请注意,使用进程替换可以更简洁地编写命令(感谢@phk的注释):
comm-12
grep-E“^\+”
来自先前接受的答案,它是不完整的,因为它留下了非源代码内容
grep-v'+++b'
删除文件名为更高版本的非源代码行
cut-c2-
删除+
符号列,也可以使用sed的/^\+/'
comm
或sdiff
因为git而不是一个选项。类似于,但希望更容易理解和调整:
diff \
--new-line-format="%L" \
--old-line-format="" \
--unchanged-line-format="" \
A1 A2
A2中添加的所有行是否都是文件的新行?我的意思是现有行没有重复项?假设文件A1
包含一行x
,文件A2
包含一行x
,另一行xx
。此命令不输出任何内容,因为A2
中的两行都包含x
grep
-x
(--line regexp
)可用于确保整行匹配。因此,如果A1包含x
,A2包含xx
,则找不到匹配项。您可能还需要使用选项-F
或--固定字符串
。否则,grep
将把A1
解释为正则表达式。因此,如果A1
包含行*
,它将匹配所有内容。因此,整个命令将是:grep-vxF-fa1a2
您能解释一下这些选项吗,我无法从手册页获取它们更多gnu请查看此链接'
在之后-未更改的组格式='
看起来像一个“
,这不起作用。可能将'
更改为”“
以免有人用一个“
。顺便说一句,这是一个比所选答案好得多的答案。它提供了您想要的内容,而不是充斥着+
符号和不必要的元行的输出。对我来说,这还显示了已更改的行,不仅仅是全新的行。这将在行的开头留下+
您可以删除那些使用sed的行:diff-u A1 A2 ^\+'| grep'^\+'| sed-E的/^\+/'
@AmauryD您的编辑去掉了第一行++A2
,但在每行的开头留下一个+
符号,这就是上面的comment和sed命令所涉及的内容。您可以将grep
和sed
组合在一个命令中:diff-u A1 A2 | sed-n'/^+[^+]/s/^+//p'
缺点:此解决方案会留下引用行号的行,例如,@-31,6+630,8@
因为我们在这里讨论的是bash
最后一个命令可以简化为comm-12,先生,您是我的英雄。最好的答案!这将返回已添加的行,仅此而已。我认为这应该是公认的答案
comm -23 a b
comm -13 a b
comm -3 a b | sed 's/^\t//'
sort <a >a.sorted
sort <b >b.sorted
comm -12 a.sorted b.sorted
comm -12 <(sort < a) <(sort < b)
git diff path/file.css | grep -E "^\+" | grep -v '+++ b/' | cut -c 2-
diff \
--new-line-format="%L" \
--old-line-format="" \
--unchanged-line-format="" \
A1 A2