我有两个文件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命令所要处理的内容。
grep
and组合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