Bagaimana cara mengedit banyak file teks dengan satu perintah?


18

Saya ingin menghapus baris pertama dari beberapa file teks dan menggantinya dengan baris lain. Apakah ada cara untuk melakukan ini menggunakan terminal?

Saya tahu cara menggunakan vim, apakah ada cara untuk mengotomatiskannya? Saya ingin menghindari melakukannya secara manual (seperti dalam mengedit setiap file satu per satu).

Jika mungkin saya ingin menghindari menginstal perpustakaan baru (terutama untuk sesuatu seperti itu yang saya anggap sangat sederhana - tapi saya bisa saja salah).

Terima kasih sebelumnya!

Jawaban:


21

Anda bisa menggunakan sed:

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

Ini akan menggantikan baris pertama dari semua .txtfile dalam direktori saat ini dengan teks new line, mengubahnya untuk memenuhi kebutuhan Anda.

File asli juga akan didukung dengan .bakekstensi, jika Anda tidak ingin itu hanya menggunakan:

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

Terima kasih! sedsebenarnya apa yang saya cari!
TomTsagk

@ TomTsagk Senang saya bisa membantu :)
heemayl

11

Nah, menggunakan vimsendiri:

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

Apa yang dilakukan:

  • setline (n, text), Baik, adalah fungsi yang set garis nuntuk text.
  • call diperlukan untuk memanggil fungsi.
  • bufdo digunakan untuk mengulangi perintah melintasi buffer (tanpa rentang, itu bekerja pada semua buffer).
  • wqmenyimpan dan keluar dari buffer. Kita perlu melakukan ini sebelum pindah ke buffer berikutnya, jadi perintah ini dirantai ke callperintah menggunakan |.
  • -c cmdmenjalankan cmdadalah perintah-mode perintah setelah memuat buffer pertama.
  • Nes Mengaktifkan no-kompatibel, silent, ex-mode, yang lebih baik untuk pemrosesan non-interaktif.

Manfaat:

  • The setlinekonten teks bisa apa saja - sebuah &di sedteks pengganti dapat memiliki efek yang tidak diinginkan.

sedtampaknya jauh lebih mudah digunakan, tetapi benar-benar hebat yang vimdapat melakukan hal yang sama! Terima kasih banyak atas jawaban Anda!
TomTsagk

@ TomTsagk, saya hanya ingin mengilustrasikan bagaimana Anda bisa bertindak di banyak file ( bufdo). Anggap Anda memiliki file yang sudah terbuka dan ... Dan untuk menunjukkan alternatif 1s/foo/bar/.
muru

Awesoming !!! <3_ <3
Campa

3

Beberapa opsi lain:

  • awk(membutuhkan versi GNU yang relatif baru awk)

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

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

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

2

Script ini akan melakukan seperti yang Anda minta, menempatkan file yang diubah di direktori baru tanpa benar-benar mengubah aslinya.

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

Saya lambat menjawab (menguji kode saya) ... dan saya suka solusi heemayl jauh lebih baik!
Charles Boling

0

Menggunakan gawk

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

Contoh

% 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: Saya menggunakannya untuk pencarian dan penggantian massal. Ini kuat dengan kemampuan untuk menggunakan RegEx - Regular Expressions. Anda dapat beroperasi pada file dalam direktori, tentukan ekstensi file, misalnya, ".html" dan sebagainya. Dan, Anda dapat melihat lokasi perubahan kandidat dalam konteks, dalam GUI. jEdit bagus.

jEdit tersedia melalui pusat perangkat lunak Ubuntu.


0

Perintah ekor dan kucing akan melakukan ini dengan mudah:

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

Bungkus mereka dalam loop yang sesuai dan mungkin menggunakan file temporer yang tepat dan benar bukan nama file temporer yang dikodekan. Saya percaya bash dan shell lain memiliki sintaks untuk membuat file sementara.

Opsi -n dari tail memiliki dua interpretasi tergantung pada apakah argumen memiliki tanda tambah. Jika memiliki tanda tambah maka itu berarti menunjukkan ekor file mulai dari nomor baris yang diberikan. Kalau tidak, angkanya adalah jumlah garis, termasuk garis terakhir, yang seharusnya dihasilkan oleh ekor.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.