Tek bir komutla birden fazla 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'i nasıl kullanacağımı biliyorum, onunla otomatikleştirmenin bir yolu var mı? Bunu manuel olarak yapmaktan kaçınmak istiyorum (her dosyayı tek tek düzenlerken olduğu gibi).

Eğer mümkünse, yeni kütüphaneleri kurmaktan kaçınmak istiyorum (özellikle çok basit düşündüğüm bir şey için - ama yanılıyor olabilirim).

Şimdiden teşekkürler!

    
sordu TomTsagk 02.08.2015 00:47

7 cevap

20

sed kullanabilirsiniz:

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

Bu, .txt metniyle geçerli dizindeki tüm new line dosyalarının ilk satırını değiştirecek ve ihtiyacınızı karşılayacak şekilde değiştirecektir.

Ayrıca, yalnızca kullanmak istemiyorsanız, orijinal dosyalar .bak uzantısıyla yedeklenir:

sed -i '1s/^.*$/new line/' *.txt
    
verilen cevap heemayl 02.08.2015 00:57
11

Eh, vim kendisini kullanarak:

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

Bunun ne işe yarar:

  • setline (n, text) , n satırını text 'ye ayarlayan bir işlevdir.
  • İşlevleri çağırmak için call gereklidir.
  • Tamponlar arasında bir komutu tekrarlamak için bufdo kullanılır (aralıksız olarak tüm tamponlarda çalışır) ).
  • wq arabelleği kaydeder ve çıkarır. Bir sonraki arabelleğe geçmeden önce bunu yapmamız gerekiyor, bu yüzden bu komut call komutunu kullanarak | komutuna zincirlenir.
  • -c cmd işlevi cmd , ilk arabelleği yükledikten sonra bir komut modu komutudur.
  • Nes , etkileşimli olmayan işlemler için daha iyi olan, uyumlu olmayan, sessiz, eski modu açar.

Yararları:

  • setline metin içeriği herhangi bir şey olabilir - & yedek metindeki bir sed istenmeyen etkilere sahip olabilir.
verilen cevap muru 02.08.2015 01:16
3

Diğer birkaç seçenek:

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

    $ 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
    
verilen cevap terdon 02.08.2015 10:18
2

Bu betik, istediğiniz gibi değişiklik yapar ve değiştirilen dosyaları orijinalleri değiştirmeden yeni bir dizine yerleştirir.

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
    
verilen cevap Charles Boling 02.08.2015 01:04
0

gawk

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

Örnek

% 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
    
verilen cevap A.B. 02.08.2015 11:30
0

jEdit: Kitle bulmak ve değiştirmek için kullanıyorum. RegEx - Düzenli İfadeleri kullanma yeteneği ile güçlüdür. Bir dizindeki dosyalar üzerinde çalışabilir, dosya uzantılarını belirtebilirsiniz, ör. ".Html" vb. Ayrıca, bir GUI'de bağlamdaki aday değişiminin yerel ayarlarına bakabilirsiniz. jEdit harika.

jEdit Ubuntu'nun yazılım merkezi üzerinden kullanılabilir.

    
verilen cevap Roger 10.08.2015 22:02
0

Kuyruk ve kedi komutları bunu kolayca yapabilir:

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

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

Kuyruğun -n seçeneğinin argümanın artı işareti olup olmamasına bağlı olarak iki yorumu vardır. Eğer bir artı işareti varsa, o zaman dosyanın kuyruk satırını başlayarak verilen satır sayısını göstermek demektir. Aksi takdirde, sayı, son satır dahil olmak üzere, satırın çıktısının alınması gereken satır sayısıdır.

    
verilen cevap cardiff space man 03.09.2015 19:55

Etiketlerdeki diğer soruları oku