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.