\r\n\r\n

linux端末で2つのテキストファイルを比較する方法

テキストファイルの2つのバージョンの違いを確認する必要がありますか?そうすると、diffが必要なコマンドになります。このチュートリアルでは、Linuxとmacosでdiffを使用する方法、簡単に...

テキストファイルの2つのバージョンの違いを確認する必要がありますか?そうすると、diffが必要なコマンドになります。このチュートリアルでは、LinuxとmacOSでdiffを使用する方法を簡単に説明します。

違いに飛び込む

diffコマンドは、2つのファイルを比較し、その差分の一覧を生成するコマンドです。より正確には、2番目のファイルと一致させるために1番目のファイルに加えるべき変更点のリストを生成するのです。このことを念頭に置いておくと、diffの出力を理解しやすくなります。 diffコマンドは、ソースコード・ファイル間の差分を見つけ、patchコマンドなどの他のプログラムで読み込んで実行できるような出力を生成するために設計されています。このチュートリアルでは、最も便利でユーザーフレンドリーなdiffの使用方法について説明します。

この2つのファイルを詳しく分析してみましょう。コマンドライン上のファイルの順番によって、diffがどのファイルを「最初のファイル」と見なし、どのファイルを「2番目のファイル」と見なすかが決まります。以下の例では、alpha1が1つ目のファイル、alpha2が2つ目のファイルです。どちらのファイルにも表音文字が含まれていますが、2番目のファイルであるalpha2にはさらに編集が加えられており、2つのファイルは同一ではありません。

このコマンドを使って、ファイルを比較することができます。diff、スペース、1つ目のファイル名、スペース、2つ目のファイル名と入力し、Enterキーを押します。

diff alpha1 alpha2

アウトプットをどう分析するか?何を見ればいいのかが分かれば、それほど悪いことではありません。各差異を順番に列挙し、各差異にラベルを付けています。ラベルには、例えば4c4のように、文字の両側に数字が書かれています。 最初の数字はα1の行番号、2番目の数字はα2の行番号です。その間の文字もあり得る。

  • c:最初のファイルの行は、2番目のファイルの行と一致するように変更する必要があります。
  • d:1つ目のファイルの行を削除して、2つ目のファイルと一致させる必要があります。
  • A:1つ目のファイルに、2つ目のファイルと一致するようなコンテンツを追加する必要があります。

この例の4c4は、alpha1の4行目をalpha2の4行目と一致するように変更する必要があることを意味しています。これは、diffが2つのファイルの間に見つけた最初の相違点です。

この例では、α1の場合、<で始まる行が1番目のファイル、>で始まる行が2番目のファイルα2を示しています。 < Deltaという行は、α1の4行目の内容が単語Deltaであることを示しています。Daveという行は、Daveという単語がalpha2の4行目の内容であることを物語っている。要約すると、2つのファイルの行が一致するように、alpha1の4行目のDeltaをDaveに置き換える必要があるということである。

次の変化は12c12で示されます。同じ論理を適用すると、alpha1の12行目にはLimaという単語が含まれているが、alpha2の12行目にはLinuxという単語が含まれているということになる。

3つ目の変更点は、alpha2から削除された行を指しています。21d20というタグは、「2つのファイルの20行目以降を同期させるために、最初のファイルから21行目を削除する必要がある」と解読されます。統一行の < は、alpha1 から削除する必要のある行の内容を示しています。

4つ目の違いは、26a26,28というタグが付いています。この変更は、α2に追加された3つの行に関連しています。ラベルの26,28に注意。カンマで区切られた2つの行番号は、行番号の範囲を示します。この例では、26 行目から 28 行目までの範囲とする。このタグは、「2番目のファイルの26行目から28行目を、1番目のファイルの26行目に追加する」と解釈されます。奇抜なもの、奇妙なもの、魅力的なものなどです。

名言

2つのファイルが同一かどうかだけ知りたい場合は、-s(report identical files)オプションを使用します。

diff -s alpha1 alpha3

q (brief) オプションを使用すると、2つのファイルの違いについて、同じように簡潔な記述を得ることができます。

diff -q alpha1 alpha2

注意点としては、同一のファイルが2つある場合、-q(brief)オプションは全く開示されず、何も報告されないことである。

別の視点

y(サイド・バイ・サイド)オプションは、ドキュメントの違いを表現するために別のレイアウトを使用します。サイドバイサイド表示で-W(width)オプションを使って表示する列の数を制限すると便利なことが多い。これにより、出力が読みづらくなる見苦しい折り返し行を回避することができます。ここでは、diff に横並びの表示を生成し、出力を 70 カラムに制限するように指示しました。

diff -y -W 70 alpha1 alpha2

コマンドライン上の最初のファイルalpha1が左側に、2行目のalpha2が右側に表示されます。各ファイルの行が並んで表示されます。α2のこれらの行の横には、変更、削除、追加されたインジケータが並んでいます。

  • |: 2番目のファイルの変更された行。
  • <: 2番目のファイルから削除された行。
  • >: 2番目のファイルに追加された行で、1番目のファイルにはないもの。

ファイルの差分をよりコンパクトに横に並べて表示したい場合は、--suppress common line オプションを使用します。これにより、diffは変更、追加、削除された行のみをリストアップするようになります。

diff -y -W 70 --suppress-common-lines alpha1 alpha2

色をつける

また、colordiffというユーティリティは、diffの出力にカラーハイライトを追加します。これにより、どの行に違いがあるのかがわかりやすくなります。

Ubuntuまたはその他のDebianベースのディストリビューションを使用している場合は、apt getを使用してシステムにこのパッケージをインストールしてください。その他のLinuxディストリビューションでは、代わりにそのLinuxディストリビューションのパッケージ管理ツールを使用してください。

sudo apt-get install colordiff

diffと同じようにcolordiffを使用します。

事実上、colordiffはdiffのラッパーであり、diffが裏ですべての作業を行います。したがって、すべてのdiffオプションはcolordiffを使用することになります。

背景を説明する

ファイル内のすべての行を画面に表示することと、変更された行だけをリストアップすることの中間点を見つけるために、diffに何らかのコンテキストを提供するように依頼することができます。その方法は2つあります。どちらの方法も同じ目的、つまり各行替えの前後にいくつかの行を表示することを実現します。差分が検出された時点で、ファイルの中で何が起こっているかを確認することができます。

最初の方法は、-c(コピーされたコンテキスト)オプションを使用します。

colordiff -c alpha1 alpha2

diffの出力にはヘッダが付きます。ヘッダーファイルには、2つのファイル名とその修正時刻が記載されています。1つ目のファイル名の前にアスタリスク(*)を、2つ目のファイル名の前にダッシュ(-)を付けます。アスタリスクとダッシュは、出力中の行がどのファイルに属するかを示すために使用されます。

真ん中の1,7のアスタリスクは、alpha1の行を見ていることを意味します。正確には、1行目から7行目までを見ています。deltaという単語は変更されたものとしてマークされています。エクスクラメーションマーク(!)が付いているの隣、赤色で表示されています。その行の前後に3行の変更されていないテキストが表示されるので、その行のファイル内での文脈を見ることができる。

真ん中の1,7の点線は、今、α2からの線を見ていることを表しています。同様に1行目から7行目までを見ると、4行目のDaveという単語が違うものとしてマークされています。

デフォルトでは、各変更の上下に3行のコンテキストが表示されます。diffで提供するコンテキストの行数を指定することができます。そのためには、大文字の "C "を付けた-C(copy context)オプションを使用し、必要な行数を指定します。

colordiff -C 2 alpha1 alpha2

コンテキストを提供する2つ目のdiffオプションは、-u(unified context)オプションです。

colordiff -u alpha1 alpha2

前回と同様、出力にヘッダーを付けています。2つのファイルに名前が付けられ、その修正時刻が表示されます。文字1の名前の前にダッシュ(-)、文字2の名前の前にプラス記号(+)がついています。これは、ダッシュでα1、プラス記号でα2を表すことを意味しています。 リストには、アットマーク(@)で始まる行が散見されます。この線が各差異の開始点となります。また、各ファイルでどの行が表示されているかも教えてくれる。

変更された行の文脈がわかるように、異なるとマークされた行の前後3行を表示します。ユニファイドビューでは、差分のある行が一つずつ表示され、α1の行の前にはダッシュが、α2の行の前にはプラス記号が表示されます。この表示は、上でコピーしたコンテキスト表示が15行かかるところを、8行で実現しています。

さすがに、統一された文脈で見たい行数を正確にdiffに求めることはできる。そのためには、-U(uniform context)オプションで大文字の "U "を指定し、必要な行数を指定してください。

colordiff -U 2 alpha1 alpha2

スペースと大文字小文字を無視する

残りの2つのファイル、test4とtest5を解析してみましょう。6人のスーパーヒーローの名前が書かれています。

colordiff -y -W 70 test4 test5

その結果、ブラック・ウィドウ、スパイダーマン、ソーのラインと差はないものの、キャプテン・アメリカ、アイアンマン、ハルクとの差が出ています。

何が違うの?テスト5では、ハルクは小文字の「h」、キャプテン・アメリカは「Captain」と「America」の間に余分なスペースが入っていますね。明らかな差はありません。ここには経験則がある。見えなければ、答えは空白です。ほぼ間違いなく、行末に1〜2個のスペースがあるか、タブがある。

行の差分が重要でない場合は、以下のような特定の種類の行の差分を無視するように diff に指示することができます。

  • -i:意見の相違がある場合
  • -Z:末尾の空白を無視する。
  • -b: ブランクボリュームの変化を無視する。
  • -w:空白の変更をすべて無視します。

もう一度diffで2つのファイルをチェックさせますが、今度は差分を無視します。

colordiff -i -y -W 70 test4 test5

The Hulk "と "The Hulk "を含む行は一致するとみなされ、小文字の "h "に違いはない。

colordiff -i -Z -y -W 70 test4 test5

やはり、そのあとの空白は、鉄人ラインの差分が表示されなくなったからに違いない。残るは「キャプテン・アメリカ」。diffはケースを無視して、空間の問題をすべて無視させましょう。

colordiff -i -w -y -W 70 test4 test5

気にしない差分を無視するようにdiffに指示することで、我々の目的のためにファイルが一致することを教えてくれるのです。

diffコマンドには他にも多くのオプションがありますが、そのほとんどは機械読み取り可能な出力の生成に関連するものです。これらは、Linuxのマニュアルページで確認することができます。上記の例で使用したオプションは、コマンドラインと人間の目で見たテキストファイルの差分をすべて追跡するために

あなたが興味を持っているかもしれない記事

匿名者
匿名者

0 件の投稿

作家リスト

  1. admin 0 投稿
  2. 匿名者 0 投稿

おすすめ