Tek bir komutla birden çok metin dosyası nasıl düzenlenir?


18

Birden çok metin dosyasının ilk satırını kaldırmak ve başka bir satırla değiştirmek istiyorum. Terminali kullanarak bunu yapmanın bir yolu var mı?

Vim kullanmayı biliyorum, onunla otomatikleştirmenin bir yolu var mı? Elle yapmaktan kaçınmak istiyorum (her dosyayı ayrı ayrı düzenlerken olduğu gibi).

Mümkünse, yeni kütüphaneler kurmaktan kaçınmak istiyorum (özellikle çok basit olduğunu düşündüğüm bir şey için - ama yanlış olabilirim).

Şimdiden teşekkürler!

Yanıtlar:


21

Şunları kullanabilirsiniz sed:

sed -i.bak '1s/^.*$/new line/' *.txt

Bu .txt, geçerli dizindeki tüm dosyaların ilk satırını metinle new linedeğiştirir, ihtiyacınıza göre değiştirir.

Ayrıca, orijinal dosyalar .bakuzantı ile yedeklenir , sadece kullanmak istemiyorsanız:

sed -i '1s/^.*$/new line/' *.txt

Teşekkür ederim! sedaslında aradığım şey!
TomTsagk

@TomTsagk Yardım edebileceğim için
mutluyum

11

vimKendini kullanarak :

vim -Nesc 'bufdo call setline(1,"This is the replacement.") | wq' file1 file2 ...

Bu ne yapar:

  • setline (n, text), İyi, kümeler hizaya bir fonksiyondur niçin text.
  • call işlevleri çağırmak için gereklidir.
  • bufdo arabelleklerde bir komutu tekrarlamak için kullanılır (aralık olmadan tüm arabelleklere etki eder).
  • wqarabellek kaydeder ve çıkar. Bir sonraki arabelleğe geçmeden önce bunu yapmamız gerekiyor, bu nedenle bu callkomut kullanarak komutla zincirlenir |.
  • -c cmdçalışır cmd, ilk arabelleği yükledikten sonra bir komut kipi komutudur.
  • Nes uyumlu olmayan, sessiz, eski modu açar, bu da etkileşimli olmayan işlemler için daha iyidir.

Yararları:

  • setlineBir - metin içeriği herhangi bir şey olabilir &bir de sedyedek metin istenmeyen etkileri olabilir.

sedkullanımı çok daha kolay görünüyor, ama vimaynı şeyi yapabilmek gerçekten harika ! Cevaplarınız için teşekkürler!
TomTsagk

@TomTsagk iyi, sadece birden fazla dosya arasında nasıl hareket edebileceğinizi göstermek istedim ( bufdo). Dosyaların zaten açık olduğunu düşünün ve ... Ve bir alternatif göstermek için 1s/foo/bar/.
muru

Awesoming !!! <3_ <3
Campa

3

Diğer birkaç seçenek:

  • awk(nispeten yeni bir GNU sürümüne ihtiyaç duyar awk)

    $ awk -i inplace -vline="new line" '(FNR==1){print line; next}1;' *.txt
    
  • Perl / kabuk

    $ for f in *txt; do
        perl -i -lne '$.==1 ? print "new line" : print' "$f"
      done
    
  • Kabuk / coreutils

    $ for f in *txt; do 
        ( echo "new line"; tail -n+2 "$f" ) > foo && mv foo "$f"; 
      done
    

2

Bu komut dosyası, istediğiniz orijinalleri değiştirmeden değiştirilen dosyaları yeni bir dizine yerleştirerek istediğiniz gibi çalışacaktır.

d=/tmp/cooked
mkdir $d
for f in *  #will match all files in current directory; adjust as desired
do
  echo "This is the new 1st line" > /${d}/${f}
  sed 1d ${f} >> /${d}/${f}
done

Yavaş cevap verdim (kodumu test ettim) ... ve heemayl'ın çözümünü çok daha iyi seviyorum!
Charles Boling

0

kullanma gawk

gawk -i inplace 'FNR==1 {$_="your_replacement"}; {print}' *.txt

Misal

% cat foo.txt 
1
2
3
4

% cat bar.txt 
1
2
3
4

% gawk -i inplace 'FNR==1 {$_="your_replacement"}; {print}' *.txt

% cat foo.txt                                                    
your_replacement
2
3
4

% cat bar.txt                                                    
your_replacement
2
3
4

0

jEdit: Toplu bul ve değiştir için kullanıyorum. RegEx - Normal İfadeleri kullanma yeteneği ile güçlüdür. Bir dizindeki dosyalar üzerinde çalışabilir, ".html" gibi dosya uzantılarını belirleyebilirsiniz. Ve, bir GUI'de bağlam değişikliğinde aday değişikliğinin yereline bakabilirsiniz. jEdit harika.

jEdit, Ubuntu'nun yazılım merkezi aracılığıyla edinilebilir.


0

Kuyruk ve kedi komutları bunu kolayca yapar:

tail -n +1 $file > tmpfile
cat newfirstline tmpfile >$file

Bunları uygun bir döngüde sarın ve sabit kodlu geçici dosya adı yerine uygun ve doğru geçici bir dosya kullanın. Bash ve diğer mermilerin geçici dosyalar oluşturmak için bir sözdizimine sahip olduğuna inanıyorum.

Kuyruğun -n seçeneği, argümanın artı işaretine sahip olup olmadığına bağlı olarak iki yorumu içerir. Artı işaretine sahipse , verilen satır numarasından başlayarak dosyanın kuyruğunu göstermek anlamına gelir . Aksi takdirde sayı, son kuyruğu da içeren kuyruğun çıkması gereken satır sayısıdır.

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.