我有两个文件A1和A2(未排序)。A1是A2的早期版本,并且某些行已添加到A2。如何获得添加到A2的新行?
注意:我只想添加新行,而不想要A1中但在A2中删除的行。当我这样做时diff A1 A2,我得到了添加和删除,但我只想要添加。
请提出一种方法。
Answers:
diff然后grep针对您想要的编辑类型。
diff -u A1 A2 | grep -E "^\+"
+该行的开头
diff -u A1 A2 | grep '^\+' | sed -E 's/^\+//'
+++ A2行,但+在每行的开头都留一个符号,这就是上面的comment和sed命令所要处理的内容。
grepand组合sed在一个命令中:diff -u A1 A2 | sed -n '/^+[^+]/ s/^+//p'
@@ -31,6 +630,8 @@
以下所有内容均直接从@TomOnTime的serverfault答案此处复制:
显示仅存在于文件a中的行:(即从a中删除的行)
comm -23 a b
显示仅存在于文件b中的行:(即添加到b中的内容)
comm -13 a b
显示仅存在于一个文件或另一个文件中的行:(但不能同时存在)
comm -3 a b | sed 's/^\t//'
(警告:如果文件a包含以TAB开头的行,则该文件(第一个TAB)将从输出中删除。)
注意:这两个文件都需要排序才能使“ comm”正常工作。如果尚未排序,则应对其进行排序:
sort <a >a.sorted
sort <b >b.sorted
comm -12 a.sorted b.sorted
如果文件过长,则可能会很麻烦,因为它需要额外的副本,因此需要两倍的磁盘空间。
编辑:请注意,可以使用进程替换来更简洁地编写命令(感谢@phk的注释):
comm -12 <(sort < a) <(sort < b)
bash这里讨论的是,最后一个命令可以简化为comm -12 <(sort < a) <(sort < b)使用进程替换。
你可以试试这个
diff --changed-group-format='%>' --unchanged-group-format='' A1 A2
这些选项记录在man diff:
--GTYPE-group-format=GFMT
format GTYPE input groups with GFMT
和:
LTYPE is 'old', 'new', or 'unchanged'.
GTYPE is LTYPE or 'changed'.
和:
GFMT (only) may contain:
%< lines from FILE1
%> lines from FILE2
[...]
''后--unchanged-group-format=''看起来像一个单一的",这是行不通的。也许更改''为""免有人输入您的答案"。
+符号和不必要的元行。
git diff path/file.css | grep -E "^\+" | grep -v '+++ b/' | cut -c 2-
grep -E "^\+" 来自先前接受的答案,它不完整,因为留下了非来源的东西grep -v '+++ b' 删除文件版本为更高版本的非源代码行cut -c 2-去除+标志柱,也可以使用sed 's/^\+//'comm还是sdiff由于git而无法选择。
类似于merp的方法,但希望它更易理解且易于调整:
diff \
--new-line-format="- %L" \
--old-line-format="" \
--unchanged-line-format="" \
A1 A2