web-dev-qa-db-ja.com

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

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

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

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

Vimは行末に^Mを表示しなかったので、各ファイルにはLinuxの行末記号があると私は思います。

16
Romski

vimユーザーの場合、ファイル間の正確な違いを表示する便利なユーティリティがあります。

vimdiff file1 file2

これにより、各ファイルがウィンドウに並べて表示され、違いが色で強調表示されます。

vimdiffにあるときに役立つコマンド

vimdiffにある間、いくつかの便利なコマンドは次のとおりです。

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

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

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

  • zo:折り畳みを開く

  • zc:折りたたみを閉じる

次に、vimdiff構成ファイルの2つのバージョンを比較するxterm内のcupsの例を示します。

enter image description here

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

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

7
John1024

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

diff file1 file2 | cat -vet

タブは^Iとして表示され、$は各行の終わりに表示されるため、末尾の空白を確認でき、印刷されない文字は^XまたはM-Xとして表示されます。

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

diff file1 file2 | cat -A

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

15
Mark Plotnick

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

Windowsでの標準的な回線終端はCRLFですが、Linuxでは単純にLFです(MacではCRでしたが、OS X以降変更されていると思います)。

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

2
fencepost

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

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

2
TOOGAM

実際の空白とタブがどこにあるかを見つけるには、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つのファイルを比較します。

1
chaos

次の内容は、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
0
Kevin Panko