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.