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

use*_*985 50 linux bash diff

我有两个文件A1和A2(未排序).A1是A2的先前版本,并且已将一些行添加到A2.如何获取添加到A2的新行?

注意:我只想添加新行并且不想要在A1中但在A2中删除的行.当我这样做时diff A1 A2,我会得到添加和删除但我只想添加.

请建议一种方法来做到这一点.

sco*_*sty 53

下面的所有内容都直接从@ TomOnTime的serverfault答案复制到这里:

显示仅存在于文件a中的行:(即从a中删除的内容)

comm -23 a b
Run Code Online (Sandbox Code Playgroud)

显示仅存在于文件b中的行:(即添加到b的内容)

comm -13 a b
Run Code Online (Sandbox Code Playgroud)

显示仅存在于一个文件或另一个文件中的行:(但不是两者)

comm -3 a b | sed 's/^\t//'
Run Code Online (Sandbox Code Playgroud)

(警告:如果文件的a行以TAB开头,则它(第一个TAB)将从输出中删除.)

注意:两个文件都需要排序"comm"才能正常工作.如果它们尚未排序,您应该对它们进行排序:

sort <a >a.sorted
sort <b >b.sorted
comm -12 a.sorted b.sorted
Run Code Online (Sandbox Code Playgroud)

如果文件非常长,这可能是一个很大的负担,因为它需要额外的副本,因此需要两倍的磁盘空间.

编辑:请注意,可以使用进程替换更简洁地编写命令(感谢@phk注释):

comm -12 <(sort < a) <(sort < b)
Run Code Online (Sandbox Code Playgroud)

  • 由于我们在这里谈论`bash`,最后一个命令可以简化为`comm -12 <(sort <a)<(sort <b)`使用进程替换. (4认同)
  • 先生,你是我的英雄。 (2认同)

tim*_*rau 44

diff然后grep是你想要的编辑类型.

diff -u A1 A2 | grep -E "^\+"
Run Code Online (Sandbox Code Playgroud)

  • 这将在行的开头留下"+" (3认同)
  • 您可以使用sed删除它们:`diff -u A1 A2 | grep'^ \ +'| sed -E's / ^ \ + //'` (3认同)
  • 您可以将 `grep` 和 `sed` 组合在一个命令中:`diff -u A1 A2 | sed -n '/^+[^+]/ s/^+//p'` (2认同)

mer*_*erp 41

你可以试试这个

diff --changed-group-format='%>' --unchanged-group-format='' A1 A2
Run Code Online (Sandbox Code Playgroud)

  • 这是一个比选定答案更好的答案,顺便说一下.给你准确的你想要的东西,而不是带有"+"符号和不必要的元线的输出. (5认同)
  • 你可以解释这些选项,我无法从手册页中获取它们 (4认同)
  • 有关更多gnu [线组格式],请参阅此链接(http://www.gnu.org/software/diffutils/manual/html_node/Line-Group-Formats.html) (2认同)

Zab*_*dor 7

你可以输入:

grep -v -f A1 A2
Run Code Online (Sandbox Code Playgroud)

  • `grep` 的 `-x` (`--line-regexp`) 可用于确保整行匹配。因此,如果 A1 包含 `x` 而 A2 包含 `xx`,则不会找到匹配项。 (2认同)
  • 您可能还需要使用选项“-F”或“--fixed-strings”。否则 `grep` 会将 `A1` 解释为正则表达式。因此,如果“A1”包含行“.*”,它将匹配所有内容。所以整个命令是:`grep -vxF -f A1 A2` (2认同)

Fra*_*sas 7

/sf/answers/1076955631/类似的方法,但希望更容易理解和易于调整:

diff \
  --new-line-format="%L" \
  --old-line-format="" \
  --unchanged-line-format="" \
  A1 A2
Run Code Online (Sandbox Code Playgroud)


Mih*_*ai8 6

简单的方法是使用

sdiff A1 A2
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用comm,正如你在linux比较2个未排序的列表中所看到的,在第二个文件中列出unique


小智 5

git diff path/file.css | grep -E "^\+" | grep -v '+++ b/' | cut -c 2-
Run Code Online (Sandbox Code Playgroud)
  • grep -E "^\+" 是从以前接受的答案,它是不完整的,因为留下非源的东西
  • grep -v '+++ b' 删除文件名为更高版本的非源代码行
  • cut -c 2-删除+标志列,也可以使用sed 's/^\+//'

comm或者sdiff因为git而不是一个选项.