Dosya içindeki başka bir dosyanın içeriğiyle kalıbı değiştirme


20

Bir metin dosyam var ( devel.xml).

Bu dizeyi farklı bir dosya ( temp.txt) içindeki içerikle değiştirmek için REPLACETHIS kelimesini ekledim .

Sahip olduğum en yakın şey şudur:

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

Bu, içeriği dizeden sonra ekler ve daha sonra dizeyi siler.

Bunu yapmanın en iyi yolu bu mu?


Sed olması gerekiyor mu? Temp.txt içinde ne kadar metin bağlı olarak, bir perl çözümüne kadar adım olabilir.
user17591

Yanıtlar:


34

Yaptığınız şey SUBSTITUTETHISdosyada göründüğü her yerde kaldırmak (ancak göründüğü satırın geri kalanını değil) ve temp.TXTbu satırın içeriğini eklemek . EğerSUBSTITUTETHIS bir satırda birden çok kez görünür, sadece ilk olay kaldırılır ve yalnızca bir kopyası temp.TXTeklenir.

SUBSTITUTETHISGöründüğünde çizginin tamamını değiştirmek istiyorsanız , dkomutu kullanın. Her ikisini de çalıştırmanız gerektiğinden rve dbir maç olduğunda, bunları hazır bir gruba koyun.

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

Bazı sed uygulamaları, komutları ayırmak için noktalı virgül kullanmanıza ve ayraçları parantezlerin etrafında tamamen atlamanıza izin verir, ancak yine de argümanı r komuta :

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

Değiştirmek isterseniz SUBSTITUTETHISDosyanın içeriği , ancak ondan önce ve sonra gelenleri saklamak daha karmaşıktır. En basit yöntem, dosyanın içeriğini sed komutuna dahil etmektir; içeriğini doğru şekilde alıntılamanız gerektiğini unutmayın.

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

Veya Perl kullanın. Bu kısa ama çalışıyorcat her değişiklik için bir kez :

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

Komut dosyası başladığında dosyayı bir kez okumak ve bir kabuk komutuna bağlı kalmaktan kaçınmak için:

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

(okunabilirlik için iki satırda sunulur, ancak satır sonunu atlayabilirsiniz). Dosya adı değişkense, alıntılama sorunlarından kaçınmak için bir ortam değişkeni yoluyla komut dosyasına iletin:

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

Nasıl bu kadar emin perl komutu değiştirebilecek yerine cat temp.txtI yapabilirdi cat ${variable}?
Maria Ines Parnisari

@MariaInesParnisari Yorum biçimlendirmesiyle ilgili bir hata yaptım. Cevabımı biraz farklı, daha sağlam bir çözümle görün.
Gilles 'SO- kötü olmayı bırak

Dosya :: Slurp her zaman yüklü olmadığından, alternatif, -0777tüm dosyada slurp yapmak için anahtarı kullanmaktır ve düzenli olarak open:perl -0777 -pe 'BEGIN {open F, q(temp.TXT); $r=<F>; chomp($r)} s/SUBSTITUTETHIS/$r/ge' -i devel.txt
mivk

r temp.TXT"BEGIN temp.TXT", "END temp.TXX" gibi mesajlarla nasıl sarılır
kyb

Sorum için çözüm buldum. Kullanım a(eklenti) komut. grymoire.com/Unix/Sed.html#uh-36
kyb
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.