ve işareti ile sed kullanma (&)


19

Ben tek tek değiştirmek yerine sahip SAS dosyaları içinde desen bulmak ve değiştirmek için sed kullanıyorum. Sorun makro değişkenleri değiştirmeye çalışıyorum ve ampersand kullandığımda doğru işlemiyor.

Here's my code:
sed -ie 's/user=&uid./user=&sysuserid./g' *_table_*.sas

Bu komutu her çalıştırdığımda, orijinal metne her türlü korkak şey ekliyor ve yapıyor gibi görünüyor.

Soru: Ve işaretleri içeren metni sed komutuyla nasıl değiştirebilirim?


6
&özel bir karakterdir, bu 's/user=&uid./user=\&sysuserid./g'yüzden 's/user=&uid\./user=\&sysuserid./g'
— RHS'de kullanıldığında kaçması

1
evet, sağdaki '&' temelde "solda eşleşen her şey" anlamına gelir, bu yüzden '\' ile kaç. Sadece bir yorumdan ziyade bu cevabı vermelisiniz.
— Edward Falk

ilk dönem kaçmak zorunda değildi ... sadece başka bir kafa kadar meraklıydı :)
— lucasdavis500

Yanıtlar:


25

&yedek metinde özel şudur: değiştirir böylece burada ne yapıyoruz “desen tarafından eşleşti girişin bütün bölümünü” anlamına user=&uidXile user=user=&uidXsysuserid.. Değiştirilen metne gerçek ve işareti eklemek için tuşunu kullanın \&.

Yanlış görünen başka bir şey ., arama deseninde herhangi bir karakteri (yeni satır hariç) temsil eder, ancak .değiştirilen metnin sonundaki değişmez bir noktadır. Yalnızca değişmez dizeyi değiştirmek istiyorsanız user=&uid., öğesini .ters eğik çizgi ile koruyun .

sed -e 's/user=&uid\./user=\&sysuserid./g'

Herhangi bir karakteri değiştirmek ve sonuçta korumak istiyorsanız, karakteri bir gruba koyun ve \1bu gruba başvurmak için yerine kullanın.

sed -e 's/user=&uid\(.\)/user=\&sysuserid\1/g'

Aslında, orijinal metin ve değiştirme arasındaki tekrarlama göz önüne alındığında, yine de grupları kullanmalısınız:

sed -e 's/\(user=&\)u\(id\.\)/\1sysuser\2/g'

yani “yerine ugöre sysuseraralarında user=&ve id.”.


grupları açıklayabilir misiniz?
— lucasdavis500

2
@ lucasdavis500 Bir grup, desenin bir bölümünü tanımlar. Ters eğik çizgi parantezleri ile sınırlandırılmıştır. Örneğin , eşleme dizesini bir grup olarak \(user=&\)eşleyen user&ve saklayan bir modeldir (modeldeki ilk grup olduğu için grup numarası 1). Daha sonra yedek \1grup 1 için saklanan dize ile değiştirilir.
— Gilles 'SO- kötü olmaktan

(user = &) kullanıcı = & değil, user & depolar mı?
— lucasdavis500

@ lucasdavis500 Yorumunuzu anlamıyorum. =Normal ifadelerdeki ve yedek metindeki karakter kendini temsil eder, bu nedenle user=&yalnızca eşleşir user=&ve user=&değiştirme metninde user=, satırın normal ifadeyle eşleşen kısmı gelir.
— Gilles 'SO- kötü olmayı kes

1
@ lucasdavis500 =Karakterin özel bir anlamı yok. user=&değiştirilen metinde user=orijinal eşleşen metni izler. user=\&yedek metinde üretiruser=&
— Gilles 'SO- kötü olmayı bırak'
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.