如何在linux中获得两个文件之间的差异(仅添加内容)

如何在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 你可以试试

我有两个文件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 --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