Saya memiliki file teks yang memiliki garis seperti sesuatu
sometext sometext sometext TEXT_TO_BE_REPLACED sometext sometext sometext
Saya perlu mengganti seluruh baris di atas dengan
This line is removed by the admin.
Kata kunci pencarian adalah TEXT_TO_BE_REPLACED
Saya perlu menulis skrip shell untuk ini. Bagaimana saya bisa mencapai ini dengan menggunakan sed
?
Jawaban:
Anda dapat menggunakan perintah perubahan untuk mengganti seluruh baris, dan
-i
bendera untuk melakukan perubahan di tempat. Misalnya, menggunakan sed GNU:sumber
c\
ketika diikuti langsung oleh variabel:…c\$VAR…
Garis miring terbalik akan keluar dari dolar. Dalam hal ini saya (bash / sed di Ubuntu 15.10) harus menulis…c\\$VAR…
sed -i '' '/TEXT_TO_BE_REPLACED/c\This line is removed by the admin.' /tmp/foo
; (ketika param pertama kosong itu diedit dalam file, jika tidak membuat cadangan)Anda perlu menggunakan wildard (
.*
) sebelum dan sesudah untuk mengganti seluruh baris:sumber
sed -i -e "s/.*search_string.*/Replacement_line/' file_being_searched.txt
-i
opsiJawaban yang diterima tidak berfungsi untuk saya karena beberapa alasan:
-i
dengan ekstensi nol panjangc\
perintahnya aneh dan saya tidak bisa menjalankannyaJadi di sini adalah solusi yang saya temukan yang menurut saya harus bekerja untuk kebanyakan kasus:
Jadi penggunaan sampel untuk memperbaiki masalah yang ditimbulkan:
sumber
Jawaban di atas:
Berfungsi dengan baik jika string / jalur pengganti bukan variabel.
Masalahnya adalah bahwa pada Redhat 5
\
setelahc
lolos$
. Dobel\\
juga tidak bekerja (setidaknya pada Redhat 5).Melalui hit dan trial, saya menemukan bahwa
\
setelahc
itu berlebihan jika string / garis pengganti Anda hanya satu baris. Jadi saya tidak menggunakan\
setelah ituc
, menggunakan variabel sebagai garis pengganti tunggal dan itu adalah sukacita.Kode akan terlihat seperti:
Perhatikan penggunaan tanda kutip ganda sebagai ganti tanda kutip tunggal.
sumber
Semua jawaban yang diberikan sejauh ini mengasumsikan bahwa Anda tahu sesuatu tentang teks yang akan diganti yang masuk akal, karena itulah yang ditanyakan OP. Saya memberikan jawaban yang mengasumsikan Anda tidak tahu apa-apa tentang teks yang akan diganti dan bahwa mungkin ada baris terpisah dalam file dengan konten yang sama atau serupa yang Anda tidak ingin diganti. Selanjutnya, saya berasumsi Anda tahu nomor baris dari baris yang akan diganti.
Contoh berikut menunjukkan penghapusan atau perubahan teks dengan nomor baris tertentu:
sumber
untuk manipulasi file konfigurasi
saya datang dengan solusi ini yang terinspirasi oleh jawaban skensell
configLine [searchPattern] [replaceLine] [filePath]
itu akan:
Fungsi:
keajaiban status keluar gila berasal dari https://stackoverflow.com/a/12145797/1262663
sumber
ini bekerja dengan baik
sumber
Di makefile saya, saya menggunakan ini:
PS: JANGAN lupa bahwa -i sebenarnya mengubah teks dalam file ... jadi jika pola yang Anda tetapkan sebagai "Revisi" akan berubah, Anda juga akan mengubah pola untuk diganti.
Contoh output:
Jadi jika Anda menetapkan pola "Revisi: 1190" itu jelas tidak sama dengan yang Anda definisikan sebagai "Revisi:" saja ...
sumber
file find_replace berisi 2 kolom, c1 dengan pola untuk mencocokkan, c2 dengan penggantian, lingkaran sed menggantikan setiap baris yang menggabungkan salah satu pola variabel 1
sumber
sed
sekali dengan file skrip yang berisi semua penggantian yang ingin Anda lakukan. Menjalankansed -i
file yang sama berulang kali adalah antipattern yang mengerikan.Ini mirip dengan yang di atas ..
sumber
FOO=TEXT_TO_BE_REPLACED
untukFOO=This line ...
jadi tidak memenuhi spesifikasi.Perintah di bawah ini berfungsi untuk saya. Yang bekerja dengan variabel
sumber
Saya sangat sering menggunakan regex untuk mengekstrak data dari file yang baru saja saya gunakan untuk mengganti kutipan literal
\"
dengan//
tidak ada :-)sumber