Linuxの2つのファイル間の空白の違い


15

diffと比較すると、すべての行が変更されたことを示す2つのファイルがあります。それらをdiff -w(空白を無視して)比較すると、予想される最小限の変更がいくつか表示されます。

明らかに、各ファイルの空白には多少の違いがありますが、それらが何であるか、またはそれらを見つける方法はわかりません。ファイルを編集して、空白が実際には(タブではなく)スペース文字であることを確認しましたが、他に何をすべきかわかりません。

:set list on行末に末尾スペースがないことを確認するために、vimを使用しました。

また、vimでは行末に表示されなかったため、各ファイルにはLinuxの行末記号が含まれていると思います^M


1
末尾の空白(行末)を確認しましたか?このようなスペースは検出されますdiffが、多くのエディターは、デフォルトではこのスペースを表示しません。
John1024

良い提案。「:set list on」でvimを使用しましたが、これは行末に「$」を表示し、末尾のスペースはありませんでした。質問を更新します
ロムスキー

あなたがvimユーザーである場合、あなたはvimdiff file1 file2違いが何であるかを見るために使用してみましたか?
John1024

@ John1024私はvimdiffを知りませんでしたが、有望に見えます。それを答えとして追加し、受け入れます
ロムスキー

1
Vimが^ Mを表示するのは、Unixの行末を誤検出したが、実際にはファイルにDOSの行末がある場合だけです。通常、これは、元のファイルとは異なる行末のパッチを適用するなど、単一のファイルで行末が混在している場合に発生します。vimがDOS行の終了を正しく検出した場合、^ Mは表示されませんでした。
ライライアン

回答:


7

以下のためvimのユーザー、ファイル間の正確な違いを示すための便利なユーティリティがあります:

vimdiff file1 file2

これにより、各ファイルがウィンドウに横に並べられ、色で強調表示された差分が表示されます。

いくつかの便利なコマンド vimdiff

にはvimdiff、いくつかの便利なコマンドがあります:

  • ]c:次の変更にジャンプ

  • [c:前の変更にジャンプ

  • ctrl-W ctrl-W:他のウィンドウに切り替える

  • zo:折り目を開く

  • zc:折り目を閉じる

ここでの例であるvimdiffxtermの比較二つのバージョンcupsの設定ファイル:

ここに画像の説明を入力してください

同じ行の長いセクションが折りたたまれていることがわかります。で再び開くことができますzo

カラースキームは、オプション設定によって異なります。上記の例では、あるファイルに行が表示され、他のファイルには表示されない場合、その行には暗い青色の背景が与えられます。他のファイルでは、欠落している行は破線で示されています。両方のファイルに線が表示されているが、いくつかの違いがある場合、線の変更されていない部分の背景はピンクになり、変更された部分の背景は赤になります。


14

FreeBSDまたはほとんどのLinuxシステムでは、diffの出力をパイプ処理して、cat -v -e -t空白の違いを表示できます。

diff file1 file2 | cat -vet

タブはとして表示され^I、a $は各行の最後に表示されるため、末尾の空白が表示され、印刷され^Xない文字はまたはとして表示されM-Xます。

GNU coreutils(busybox以外のほとんどのLinuxディストリビューションで利用可能)がある場合、これは次のように簡略化できます。

diff file1 file2 | cat -A

busyboxシステムでは、を使用しますcatv -vet


2

Windowsマシンでファイルの1つが編集されましたか?

Windowsでの標準の回線終端はCRLFで、Linuxでは単純にLFです(MacではCRでしたが、OS Xから変更されたと思われます)。

wc -lファイルを試して、行数を確認し、サイズの違いが行数と同じかどうかを確認します(最後の行が1つのファイルで終了しない場合があります)。


早速のお返事ありがとうございます。行数を数えると、1つのファイルにさらに5行あることがわかります(編集したときにこれが予想されます)。Linuxマシンから1つのファイルを取得し、もう1つをコードリポジトリからLinuxにチェックアウトしました。vimでWindowsターミネータを使用してファイルを表示すると、最後の文字が^ Mと表示されると思いますが、そうではありません。
ロムスキ

3
vimは実際には、回線終端を自動検出するのに十分なほどスマートです。詳細については、stackoverflow.com / questions / 3852868を参照してください。
フェンスポスト

私はそれを知りませんでした!再確認します
ロムスキー

2

od役立つかもしれません。Octal Dumpコマンドは、内容を16進数で表示できます。これは、ヌルバイトや予期しない空白を含むファイル内のバイトを確認するのに役立ちます。考えられる一般的な原因は、LF vs CRLF、タブvsスペース、またはASCII vs Unicode(多くの場合、通常表示される各バイトの前にヌルバイトがある場合があります)です。 od -x filenameこれらのパターンのいずれかを明らかにする必要があります。ファイルを表示するためのより精巧な方法が必要な場合は、「16進エディタ」で問題なく実行できます。良い点odは、cutコマンドと同様に、多くのUnixシステムに組み込まれていることです。そのため、多くの場合、個別のインストールは不要です。

ファイルをより似たものにする必要がある場合trは、いくつかの変更を加えるsedことができます。おそらくls -l、どのファイルが大きいかを確認し、次にバイトを表示して変更する必要があるものを確認し、次にファイルの1つを変更してより類似しているように見えるようにします。


1

実際の空白とタブがどこにあるかを調べるにはsed、たとえば次を使用してそれらを置き換えることができます。

$ cat file
  line 1
  line 2
    line 6
        line 7
$ sed 's/ /-/g; s/\t/<tab>/g' file
--line-1
--line-2
<tab>line-6
<tab><tab>line-7

そして、2つのファイルを比較します。


さらに良いことに、diff出力でそのフィルターを実行できます。またはcatsuperuser.com
a / 913368/37154の

0

以下の内容は、Romskiによって書かれた上記の「質問」セクションからコピーされました。

どちらvimdiffdiff file1 file2 | cat -Aツールの観点から非常に有用でした。

最後に、もう1つの問題が見つかりました。一部のファイルはUTF-8 BOMでエンコードされています。これはを使用して強調表示されましたdiff file1 file2 | cat -A。これM-oM-;M-?は、影響を受けるファイルの先頭に現れました。

$ diff file1 file2 | cat -A
< package com.mycompany;$
---$
> M-oM-;M-?package com.mycompany;$

いくつかの問題がありましたが、ファイルをクリーンアップする必要があるユーザーのために、以下のコマンドをいくつかリストしました。

# recursively remove UTF8 BOM
find . -type f -exec sed -i -e '1s/^\xEF\xBB\xBF//' {} \;

# recursively replace CRLF with LF
find . -type f -print0 | xargs -0 dos2unix
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.