A1とA2(未分類)の2つのファイルがあります。A1はA2の以前のバージョンであり、いくつかの行がA2に追加されています。A2に追加された新しい行を取得するにはどうすればよいですか?
注:新しい行を追加したいだけで、A1にはあったがA2では削除された行は必要ありません。私がそうするときdiff A1 A2
、私は追加と削除を取得しますが、私は追加だけが欲しいです。
これを行う方法を提案してください。
以下のほとんどは、@TomOnTimeのserverfault回答から直接コピーされています。下部には、ソートされていないファイルで機能する試みがありますが、コマンドは差分を与える前にファイルをソートするため、多くの場合、それは望ましいものではありません。ソートされていないファイルの適切にフォーマットされた差分については、他の回答がより役立つ場合があります(これを指摘してくれた@Fritzに感謝します):
ファイル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
次にgrep
、必要な編集タイプを選択します。
diff -u A1 A2 | grep -E "^\+"
あなたはこれを試すことができます
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
[...]
https://stackoverflow.com/a/15385080/337172と同様のアプローチですが、うまくいけば、より理解しやすく、簡単に調整できます。
diff \
--new-line-format="%L" \
--old-line-format="" \
--unchanged-line-format="" \
A1 A2
簡単な方法は次を使用することです:
sdiff A1 A2
もう1つの方法は、を使用することです。これは、Linuxでの2つのソートされていないリストの比較comm
でわかるように、2番目のファイルに一意のリストをリストします。
次のように入力できます。
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のためにオプションではありませんでした。