2013-03-03 23 views
8

Bir ifadeyi sed kullanarak değiştirmeye çalışıyorum. Regex vim içinde çalışır, ancak sed olarak değil. ÖyleGeri dönüş yanlış değere dönüyor

/www/file-name-1 

Ben aşağıdaki komutu kullanıyorum

/www/file-name/1 

dönmelidir eğik çizgiyle sayısı önceki son tire yerine gidiyorum ama çıkışı tutar/www/dosya adı/0 yerine

sed 's/-[0-9]/\/\0/g' input.txt 

Neyi yanlış yapıyorum? Bu OS X altında sed görünüyor

cevap

15

daha sonra başvurmak için veri parantez arasına Sen çevreleyen gerekir ait \1 deneyin başlar ve sed tüm karakterleri kurtarmak için 1. maddede saymaya başlar Parantez gerektirmeden eşleştirilir, & sembol kullanılır.

sed 's/-\([0-9]\)/\/\1/g' input.txt 

Yani verimleri:

/www/file-name/1 
+0

Doğru cevap budur. @ User2052491 parantez kullanmadığını fark etmedim. – maljub01

+0

Köşeli parantezler için gerekli olan ters eğik çizgi gerekli değil mi? – Blauhirn

0

1'den sayma geribaşvurularla yerine \0

+0

\ 1 kullanıyorsanız, "RE'de tanımlı değil" i döndürür – user2052491

+0

OS X/macOS eski UNIX araçlarına sahiptir. '-r' kullanamazsınız, bu parantezlerden kaçmanız gerektiği anlamına gelir. –

+0

OS X'in sed uzantısı, genişletilmiş regex'i etkinleştirmek için -R yerine -E kullanır – thenickdude

5

Sen (a \1 başlangıç ​​olan) referans yedekleyebilirsiniz önce parantez kullanarak yakalamanız gerekir. sed -r 's|(.*)-|\1/|' deneyin:

$ sed -r 's|(.*)-|\1/|' <<< "/www/file-name-1" 
/www/file-name/1 

Sen sed ile herhangi bir ayırıcı kullanabilirsiniz ikame / içerdiğinde bu yüzden / iyi seçenek değildir. -r seçeneği genişletilmiş regexp için olduğundan parantezin çıkarılmasına gerek yoktur.

İlgili konular