Bagaimana cara mengedit file menggunakan terminal saja secara terprogram?


13

Saya ingin menulis skrip shell di mana saya dapat membaca file dari perintah dan mengedit file tanpa intervensi manual (berdasarkan pencarian beberapa teks dan menggantinya dengan yang lain).

Saya tidak perlu menggunakan editor teks untuk ini .... cukup mencari teks (seperti menggunakan grep) dan kemudian menggantinya dengan teks lain dan menyimpan perubahan ....

Jawaban:


10

Di situlah seddatang untuk bermain. Sebuah sedperintah memiliki format ini:

[pattern1][,pattern2][!] command [args]

Menggunakan regex sehingga bisa / akan sedikit sulit. Beberapa contoh dasar diambil dari tautan ke-2 di bawah ini:

# ganti (temukan dan ganti) "foo" dengan "bar" di setiap baris
sed 's / foo / bar /' # hanya menggantikan instance pertama dalam satu baris
sed 's / foo / bar / 4' # hanya menggantikan instance ke-4 dalam satu baris
sed 's / foo / bar / g' # menggantikan SEMUA instance dalam satu baris
sed 's / \ (. * \) foo \ (. * foo \) / \ 1bar \ 2 /' # ganti dengan case next-to-last
sed 's / \ (. * \) foo / \ 1bar /' # ganti hanya case terakhir

# ganti "foo" dengan "bar" HANYA untuk baris yang mengandung "baz"
sed '/ baz / s / foo / bar / g'

# ganti "foo" dengan "bar" KECUALI untuk baris yang mengandung "baz"
sed '/ baz /! s / foo / bar / g'

# ubah "scarlet" atau "ruby" atau "puce" menjadi "red"
sed 's / scarlet / red / g; s / ruby ​​/ red / g; s / puce / red / g' # seds paling
gsed 's / scarlet \ | ruby ​​\ | puce / red / g' # GNU hanya sed

Beberapa referensi


7

Jawabannya sangat terlambat. Namun, ini mungkin membantu orang lain dengan masalah / pertanyaan serupa.

Saya akan merekomendasikan membuat dan menerapkan tambalan. Contoh yang bagus dapat ditemukan di sini .

Misalnya, dengan asumsi bahwa file new.txt berisi perubahan yang ingin Anda terapkan ke old.txt. Anda dapat menjalankan perintah pada terminal atau dengan membuat dan menjalankan patch_file.sh.

Baris perintah: buka terminal dan salin dan jalankan baris di bawah ini (ubah nama file seperlunya):

diff old.txt new.txt > patch.patch # to create the patch
patch old.txt -i patch.patch -o patched_old.text # to apply patch

Script: menggunakan pendekatan file .sh. Di terminal (keyboard: ctrl + alt + t: gedit patch_file.sh

Salin dan tempel perintah yang ada di terminal, ke file .sh dan di bawah header seperti yang ditunjukkan di bawah ini (gedit).

#!/bin/sh
diff old.txt new.txt > patch.patch # to create the patch
patch old.txt -i patch.patch -o patched_old.text # to apply patch

Jadikan skrip dapat dieksekusi (terminal):

chmod +x patch_file.sh

Jalankan skrip (terminal):

./patch_file.sh # may require sudo access depending on the directory affected

Tambalan +1 selalu merupakan cara langsung untuk modifikasi menengah ke berat atau kompleks. Saya tidak tahu mengapa beberapa orang mencoba melakukan segala hal menggunakan alat regex.
user.dz

+1 jauh lebih baik daripada merekayasa balik sebuah regex yang tampaknya menerapkan perubahan yang Anda inginkan pada file yang Anda uji dengan ... tetapi ketika diterapkan pada contoh lain dari file itu terkadang memiliki efek lain.
bigjosh

Apakah tambalan masuk akal jika saya ingin mengganti semua contoh string teks tertentu, yaitu mengganti semua "" dengan "_", semua "minus" dengan "-", dan semua "gb | <string_of_numbers> | ARO:" with " ARO: "? Terima kasih.
Josh

1

Jika Anda ingin mengedit file, gunakan editor file, ada editor file berbasis perintah yang dapat digunakan dari skrip, seperti ex atau ed .


1

Anda sedang mencari sed atau awk. Saya menemukan sed menjadi lebih sederhana dan awk menjadi lebih kuat.

Ini contoh dari pertanyaan lain .

sed -i 's/gedit.desktop/yournew.desktop/g' /usr/share/applications/defaults.list

Ini berarti:

  • cari di file /usr/share/applications/defaults.list
  • Temukan / grep gedit.desktop
  • Ubah dengan yournew.desktop
  • Terapkan perubahan di tempatnya -i

0

Tergantung pada apa yang perlu Anda edit, jika Anda terbiasa vimaka edmungkin berguna.

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.