diffコマンドの読み方(その2)


アニメ『orange』
未来から届いた自分からの手紙。16歳の自分に後悔させないための手紙。アドバイスが正しいことが分かっていても、勇気が出せなくて、どうにもならないと思ってしまう。それでも悩んで少しずつ前進。すると、手紙には書かれていない出来事も起こり始めて。。。まだ3話ぐらいしか見ていないので、大人になった自分のシーンと、高校生の時のシーン、それに未来からの手紙が、全く結びつかず謎なので、もやもやしながら見ています。でも全部見終わったら感動するような予感はしてて、毎話待ち遠しく試聴しています。

もし私が過去の自分にアドバイスするとしたら、文章ではしないと思います。破ってしまうからです。どのようにして過去の自分に、信じさせるかが一番の問題なんです。おそらく過去の自分は、手紙を見た瞬間に破り捨てるでしょう。封筒に「やぶるな」と書いても、天邪鬼なので破ってしまいます。ロト6の当たり番号在中、と書いてあっても破ります。馬鹿なの!? 自分。
説得するにはたぶん、10年後と20年後の自分も連れて行き四者会談必要かと思います(どこかのCMで見たような)。

未来からのアドバイスがうまくいってるか知るには、やはり予定している出来事との差を確認することでしょう。ソフトウェアにおいても、差分は問題解決の糸口なので、差分抽出が柔軟に出来るようにスキルアップすれば、生産性アップすることうけあいです。

前回と同じく実験用に2つのファイルを作成します。to.txtは、from.txtからのコピーです。

~$ seq 10 > from.txt
~$ cp from.txt to.txt
~$ 

diffしてみます。

~$ diff from.txt to.txt
~$ 

当然一致します。
差分を作っていきます。sedで2行目を2からMODIFEIDに変更してみます。

~$ sed 2cMODIFIED -i to.txt

差分をdiffで見てみましょう。左右での比較と、デフォルトの表示です。

~$ diff -y -W50 from.txt to.txt
1			1
2		      |	MODIFIED
3			3
4			4
5			5
6			6
7			7
8			8
9			9
10			10
~$ diff from.txt to.txt
2c2
< 2
---
> MODIFIED
~$ 

2c2以降は、from.txtの2行目とto.txtの2行目が、後に続いているテキストにあるように、それぞれ「2」と「MODIFIED」であることを示しています。

to.txtの3行目も変更してdiffを確認しましょう。

~$ sed 3cModified -i to.txt
~$ diff -y -W50 from.txt to.txt
1			1
2		      |	MODIFIED
3		      |	MODIFIED
4			4
5			5
6			6
7			7
8			8
9			9
10			10
~$ diff from.txt to.txt
2,3c2,3
< 2
< 3
---
> MODIFIED
> MODIFIED
~$ 

2,3c2,3以降は、from.txtの2〜3行目とto.txtの2〜3行目の差分を表しています。

さらに、to.txtの4行目を変更。

~$ sed 4cMODIFIED -i to.txt
~$ diff -y -W50 from.txt to.txt
1			1
2		      |	MODIFIED
3		      |	MODIFIED
4		      |	MODIFIED
5			5
6			6
7			7
8			8
9			9
10			10
~$ diff from.txt to.txt
2,4c2,4
< 2
< 3
< 4
---
> MODIFIED
> MODIFIED
> MODIFIED
~$ 

コツが掴めました。from.txtの2〜4行目の内容「2」「3」「4」は、to.txtの2〜4行目で3つの「MODIFIED」に変更されていることを表しています。

次は削除です。to.txtの9行目を削除します。

~$ sed 9d -i to.txt
~$ diff -y -W50 from.txt to.txt
1			1
2		      |	MODIFIED
3		      |	MODIFIED
4		      |	MODIFIED
5			5
6			6
7			7
8			8
9		      <
10			10
~$ diff from.txt to.txt
2,4c2,4
< 2
< 3
< 4
---
> MODIFIED
> MODIFIED
> MODIFIED
9d8
< 9
~$ 

9d8は、from.txtの9行目の内容「9」は、to.txtでは削除され8行目に該当しています。

テキストを追加してみます。to.txtの5行目と6行目の間にADDEDという一行を追加し、diffしてみます。

~$ sed 5aADDED -i to.txt
~$ diff -y -W50 from.txt to.txt
1			1
2		      |	MODIFIED
3		      |	MODIFIED
4		      |	MODIFIED
5			5
		      >	ADDED
6			6
7			7
8			8
9		      <
10			10
~$ diff from.txt to.txt
2,4c2,4
< 2
< 3
< 4
---
> MODIFIED
> MODIFIED
> MODIFIED
5a6
> ADDED
9d9
< 9
~$ 

5a6は、from.txtの5行目の後に、to.txtの6行目としてADDEDが追加が示されています。この時、さきほど9d8だった情報は9d9となりました。前方に行が追加されたためです。

さらに2行ADDEDを入れてみます。

~$ sed 5aADDED -i to.txt
~$ !!
sed 5aADDED -i to.txt
~$ diff -y -W50 from.txt to.txt
1			1
2		      |	MODIFIED
3		      |	MODIFIED
4		      |	MODIFIED
5			5
		      >	ADDED
		      >	ADDED
		      >	ADDED
6			6
7			7
8			8
9		      <
10			10
~$ diff from.txt to.txt
2,4c2,4
< 2
< 3
< 4
---
> MODIFIED
> MODIFIED
> MODIFIED
5a6,8
> ADDED
> ADDED
> ADDED
9d11
< 9
~$ 

5a6,8は、from.txtの5行目の後にあたる行の、to.txtでは6〜8行目が、「ADDED」が3行追加されていることを表します。
先ほどと同様、削除行は前方に2行追加となっているため9d11となっています。

コメント

タイトルとURLをコピーしました