Sed dizisine Escape string girişi


0

Dosyadaki bir dizgiyi sed ile newlines içeren bir dizeyle değiştirmekle ilgili bazı problemler yaşıyorum. Aşağıdaki tamamen başarısız olacaktır. Replace_with dizesinden kaçmak zorunda kalacağımı farz ediyorum, ancak nasıl yapabileceğimi çözemiyorum, ya da bunu yapmanın en iyi yoluysa. Herhangi bir yardım takdir edilecektir

REPLACE_WITH="Blah
 de
 blah."

sed -i "s/TO_REPLACE/$REPLACE_WITH/g" file

Yanıtlar:


0

Bunun için "çift kaçış" gerekir, ancak kaçış karakterleri sed'in "s" komutuna erişmelidir, bu yüzden bash kabuğundan da kaçmaları gerekir. ("Üçlü kaçma"?)

REPLACE_WITH="Blah\\
de\\
blah."

sed -i "s/TO_REPLACE/$REPLACE_WITH/g" file

Bash, "\\" ifadesini tek bir "\" koduna dönüştürür ve sed komutunun daha sonra bitmeyen bir yeni satır anlamına gelen '\ {newline}' olarak yorumladığı tek bir '\' komutunu koyar. komuta.

Her satırın sonunda sadece bir tane '\' olsaydı bash '\ {newline}' ifadesini görecek, yani 'hiçbir şey' olarak alacaktı yani: newline ve ters eğik çizgi tamamen kaldırıldı.

Bash-sed-awk için temel kural ... eğer ters eğik çizgileriniz çalışmıyorsa, iki katına çıkmayı deneyin ... tekrar.


Ne yazık ki, bu sed çalıştırdıktan sonra aşağıdakileri üretir (doğru satır sonları ile tabii) - REPLACE_WITH = "Blah \ de \ blah."
David Davies-Jones

Evet öyle; dizedeki ters eğik çizgilerin sed komut dosyasında çok satırlı bir s /// komutu yapması gerekir. Düz bir dize "dosya" değiştirmek için yeterince alıntı dizeye alıntı yapmak istiyorsanız, muhtemelen fazladan bir sed komutuna ihtiyacınız var ... sonra ne olacak?
user3710044

Yanlış senaryoyu test ettiğimi farkettim. Şimdi tekrar deneyeceğim üzgünüm :(
David Davies-Jones

Sonunda doğru senaryo ile test etmeye başladım ve teşekkür etti :)
David Davies-Jones
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.