2つのファイルA1とA2(未ソート)があります。 A1はA2の以前のバージョンであり、A2にいくつかの行が追加されています。 A2に追加された新しい行を取得するにはどうすればよいですか?
注:新しい行を追加したいだけで、A1にあったがA2で削除された行は必要ありません。私がする時 diff A1 A2
、追加だけでなく削除も取得しますが、追加のみが必要です。
これを行う方法を提案してください。
diff
を選択してから、目的の編集タイプのgrep
を選択します。
diff -u A1 A2 | grep -E "^\+"
以下のすべては、@ TomOnTimeのserverfault answer here から直接コピーされます。
ファイル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
ファイルが非常に長い場合、追加のコピーが必要になるため、ディスク容量が2倍になるため、これはかなりの負担になる可能性があります。
編集:プロセスの置換を使用して、コマンドをより簡潔に記述できることに注意してください(コメントについては@phkに感謝します)。
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
[...]
次のように入力できます:
grep -v -f A1 A2
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