Linux'ta iki dosya arasındaki boşluk farkı


15

Diff ile karşılaştırdığımda her satırın değiştiğini gösteren iki dosyam var. Onları karşılaştırdığımda diff -w(boşluk görmezden gelirken) beklediğim birkaç minimum değişikliği gösterir.

Açıkçası her dosyadaki boşluk arasında bir fark var, ama ne olduklarını veya nasıl bulacağımı bilmiyorum. Boşluk aslında boşluk karakterleri (sekmeler aksine) olduğundan emin olmak için dosyaları düzenlemeyi denedim ama başka ne yapacağından emin değilim.

Vim ile :set list onçizgilerin sonunda boşluk olmadığını doğrulamak için kullandım .

Ayrıca vim ^Msatırların sonunda göstermediği için her dosyanın Linux satır sonlandırıcılarına sahip olduğuna inanıyorum .


1
Sondaki boşluk (çizginin sonunda) olup olmadığını kontrol ettiniz mi? Böyle bir alan algılanacak, diffancak birçok editör varsayılan olarak zaten bu alanı görünür yapmıyor.
John1024

İyi öneri. ": Set list on" ile vim kullandım, bu satırın sonunda "$" gösterdi ve sondaki boşluk yoktu.
Sorumu

Bir vimkullanıcıysanız, vimdiff file1 file2farkların ne olduğunu görmek için kullanmayı denediniz mi?
John1024

@ John1024 Vimdiff'in farkında değildim, ama umut verici görünüyor. Cevap olarak ekleyin ve kabul edeceğim
Romski

1
Vim, ^ M öğesini yalnızca bir Unix satır sonunu algıladığında ancak dosyanın aslında DOS satır sonlandırması gösterdiğinde gösterilir. Genellikle bu, tek bir dosyada biten karışık bir çizginiz varsa, örn. Orijinal dosyadan farklı bir çizgi sonu olan bir düzeltme eki uyguladığınızda olur. Vim DOS satırının doğru bir şekilde sonlandığını algıladığında, ^ M göstermezdi.
Lie Ryan

Yanıtlar:


7

İçin vimkullanıcılar, dosyalar arasında kesin farklılıklar gösteren kullanışlı bir program vardır:

vimdiff file1 file2

Bu, her bir dosyayı yan yana ve renkle vurgulanan farklara yerleştirir.

İçindeyken bazı yararlı komutlar vimdiff

İçindeyken vimdiff, bazı yararlı komutlar şunlardır:

  • ]c: bir sonraki değişikliğe atla

  • [c: önceki değişikliğe atla

  • ctrl-W ctrl-W: diğer pencereye geç

  • zo: açık kıvrımlar

  • zc: kıvrımları kapat

Misal

İşte bir örnek vimdiffbir in xterma karşılaştıran iki sürümü cupsyapılandırma dosyası:

resim açıklamasını buraya girin

Aynı satırların uzun bölümlerinin daraltılmış olduğunu görebilirsiniz. İle tekrar açılabilirler zo.

Renk şeması seçenek ayarlarınıza bağlı olarak değişir. Yukarıdaki örnekte, bir dosyada bir satır görüntülendiğinde, diğerinde görünmediğinde, bu satıra koyu mavi bir arka plan verilir. Diğer dosyada eksik çizgiler kesik çizgilerle belirtilir. Her iki dosyada da bir çizgi göründüğünde, ancak bazı farklılıklar olduğunda, çizgilerin değişmeyen kısımları pembe bir arka plana ve değiştirilen parçalar kırmızı bir arka plana sahiptir.


14

FreeBSD veya çoğu Linux sisteminde, cat -v -e -tboşluk farklarını göstermek için diff çıkışını kesebilirsiniz .

diff file1 file2 | cat -vet

Tırnaklar gösterilir ^Ibir, $bu boşluğu arka görebilmesi için her bir hattın sonunda gösterilir ve basılamayan karakterleri olarak gösterilir ^Xya da M-X.

GNU coreutils'iniz varsa (meşgul kutusu olmayan Linux dağıtımlarının çoğunda kullanılabilir), bu basitleştirilebilir

diff file1 file2 | cat -A

Meşgul kutusu sistemlerinde kullanın catv -vet.


2

Dosyalardan biri bir Windows makinesinde düzenlendi mi?

Windows'ta standart satır sonlandırma CRLF'dir, burada Linux'ta sadece LF'dir (ve Mac'lerde eskiden CR idi, ancak bunun OS X'ten beri değiştiğinden şüpheleniyorum).

wc -lDosyaları deneyin ve kaç satır olduğunu görün, ardından boyut farkının satır sayısıyla aynı olup olmadığını görün (son satır bir dosyada sonlandırılamayabilir).


Hızlı cevap için teşekkürler. Bir satır sayımı yapmak, bir dosyada 5 satır daha olduğunu gösterir (düzenlemeler yaptığım için bunu bekliyorum). Bir Linux makinesinden bir dosya aldım ve diğeri Linux'a kod deposundan teslim edildi. Ben vim içinde Windows sonlandırıcılar ile bir dosya görüntülemek son karakteri ^ M gösterecektir inanıyorum ve durum böyle değil.
Romski

3
vim aslında satır sonlandırmasını otomatik olarak algılayacak kadar akıllıdır, ayrıntılar için stackoverflow.com/questions/3852868 adresine bakın.
çit direği

Farkında değildim! Tekrar kontrol edeceğim
Romski

2

odyardımcı olabilir. Sekizlik Döküm komutu içeriği onaltılık olarak gösterebilir. Bu, boş bayt veya beklenmeyen beyaz boşluk dahil olmak üzere baytların bir dosyada ne olduğunu görmenize yardımcı olabilir. Olası yaygın nedenler LF'ye karşı CRLF, sekmelere karşı boşluklar ya da ASCII'ye karşı Unicode (normalde görünür her bayttan önce genellikle boş bir bayta sahip olabilir) olabilir. od -x filenamebu kalıplardan herhangi birini açığa vurmalı. Dosyayı görüntülemek için daha ayrıntılı bir yol istiyorsanız, herhangi bir "onaltılık düzenleyici" güzel olabilir. Bununla ilgili güzel olan şey od, cutkomut gibi, birçok Unix sistemine yerleştirilmiş olmasıdır. Bu nedenle, genellikle ayrı bir kurulum gerekmez.

Dosyaların daha benzer olması gerekiyorsa, trbazı değişiklikler sedyapabilir ve daha fazlasını yapabilirsiniz. Muhtemelen ls -lhangi dosyanın daha büyük olduğunu görmek için başlayabilir , daha sonra neyin değiştirilmesi gerektiğini görmek için baytları görüntüleyebilir ve daha sonra benzer görünecek şekilde dosyalardan birini değiştirebilirim.


1

Gerçek boşlukların ve sekmelerin nerede olduğunu bulmak sediçin bunları kullanarak değiştirebilirsiniz :

$ 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

Ve şimdi iki dosyayı karşılaştırın.


Daha da iyisi, bu filtreyi diff çıktısında çalıştırabilirsiniz. Veya superuser.com/a/913368/37154cat
clacke

0

Aşağıdaki içerik, Romski tarafından yazılan yukarıdaki "soru" bölümünden buraya kopyalanmıştır.

Her ikisi de vimdiffve diff file1 file2 | cat -Aaraçlar açısından çok faydalıydı.

Son olarak, bir sorun daha buldum. Bazı dosyalarım UTF-8 BOM ile kodlandı. Bu kullanılarak vurgulanmıştır diff file1 file2 | cat -A. Bu M-oM-;M-?, etkilenen dosyanın başında olduğu gibi kendini gösterdi :

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

Bir takım sorunlar olsa da, dosyalarını temizlemesi gerekenler için aşağıdaki birkaç komutu listeledim:

# 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.