Mengganti pola dalam suatu file dengan konten file lainnya

20

Saya punya file teks ( devel.xml).

Saya menambahkan kata REPLACETHIS untuk menggantikan string ini dengan konten dalam file yang berbeda ( temp.txt).

Hal terdekat yang saya miliki adalah ini:

sed -i -e "/REPLACETHIS/r temp.TXT" -e "s///" devel.txt;

Ini menyisipkan konten setelah string, dan kemudian menghapus string sesudahnya.

Apakah ini cara terbaik untuk melakukannya?

RafaelGP
sumber
Apakah harus sed? Bergantung pada seberapa banyak teks dalam temp.txt, saya mungkin melangkah ke solusi perl.
user17591

Jawaban:

34

Apa yang telah Anda lakukan adalah menghapus di SUBSTITUTETHISmana pun itu muncul dalam file (tetapi tidak sisa baris di mana ia muncul) dan masukkan konten di temp.TXTbawah baris itu. Jika SUBSTITUTETHISmuncul beberapa kali dalam satu baris, hanya kemunculan pertama yang dihapus, dan hanya satu salinan temp.TXTyang ditambahkan.

Jika Anda ingin mengganti seluruh baris saat SUBSTITUTETHISmuncul, gunakan dperintah. Karena Anda perlu menjalankan keduanya rdan dketika ada pertandingan, masukkan mereka dalam kelompok yang diperkuat.

sed -e '/SUBSTITUTETHIS/ {' -e 'r temp.TXT' -e 'd' -e '}' -i devel.txt

Beberapa implementasi sed memungkinkan Anda menggunakan titik koma untuk memisahkan perintah dan menghilangkan pemisah di sekitar tanda kurung, tetapi Anda masih memerlukan baris baru untuk mengakhiri argumen ke rperintah:

sed -e '/SUBSTITUTETHIS/ {r temp.TXT
                          d}' -i devel.txt

Jika Anda ingin mengganti SUBSTITUTETHISdengan konten file, tetapi simpan apa yang datang sebelum dan sesudahnya di telepon, itu lebih rumit. Metode paling sederhana adalah dengan memasukkan konten file dalam perintah sed; perhatikan bahwa Anda harus mengutip dengan benar isinya.

sed -e "s/SUBSTITUTETHIS/$(<temp.TXT sed -e 's/[\&/]/\\&/g' -e 's/$/\\n/' | tr -d '\n')/g" -i devel.txt

Atau gunakan Perl. Ini singkat tetapi berjalan catsekali untuk setiap substitusi:

perl -pe 's/SUBSTITUTETHIS/`cat temp.TXT`/ge' -i devel.txt

Untuk membaca file sekali ketika skrip dimulai, dan hindari tergantung pada perintah shell:

perl -MFile::Slurp -pe 'BEGIN {$r = read_file("temp.TXT"); chomp($r)}
                        s/SUBSTITUTETHIS/$r/ge' -i devel.txt

(disajikan pada dua baris agar mudah dibaca tetapi Anda dapat menghilangkan jeda baris). Jika nama file adalah variabel, untuk menghindari masalah mengutip, kirimkan ke script melalui variabel lingkungan:

replacement_file=temp.TXT perl -MFile::Slurp -pe 'BEGIN {$r = read_file($replacement_file); chomp($r)}
                        s/SUBSTITUTETHIS/$r/ge' -i devel.txt
Gilles 'SANGAT berhenti menjadi jahat'
sumber
Bagaimana saya bisa mengubah perintah perl sehingga bukannya cat temp.txtsaya bisa lakukan cat ${variable}?
Maria Ines Parnisari
@MariaInesParnisari Saya membuat kesalahan dengan memformat komentar. Lihat jawaban saya, dengan solusi yang sedikit berbeda, lebih kuat.
Gilles 'SANGAT berhenti menjadi jahat'
Karena File :: Slurp tidak selalu diinstal, alternatifnya adalah dengan menggunakan -0777switch untuk slurp di seluruh file, dan biasa open:perl -0777 -pe 'BEGIN {open F, q(temp.TXT); $r=<F>; chomp($r)} s/SUBSTITUTETHIS/$r/ge' -i devel.txt
mivk
Cara membungkus r temp.TXTdengan pesan seperti "BEGIN temp.TXT", "END temp.TXX"
kyb
Saya menemukan solusi untuk pertanyaan saya. Gunakan aperintah (tambahkan). grymoire.com/Unix/Sed.html#uh-36
kyb