2012-02-27 26 views
6

ile nasıl sed?Bu nasıl neden çalışmıyor (`sed?

$ more temp.txt 
(foo),(bar) 
(foobar),(foofoobar) 

$ sed 's/),(/),\n(/g' temp.txt 
(foo),n(bar) 
(foobar),n(foofoobar) 

ile ),( yılında virgülden sonra satır karakteri eklemek için,)` in virgülden sonra yeni satır karakteri girmek için?

+2

Hangi platform ve sed sürümünü kullanıyorsunuz? – potong

cevap

3

You sadece yazarken bir ters eğik çizgi karakteri ile kaçıp Enter tuşuna basın zorunda:

$ sed 's/),(/),\ 
(/g' temp.txt 
(foo), 
(bar) 
(foobar), 
(foofoobar) 
+0

Sed komutu bir bash dosyasına koyarsanız bu işe yaramaz. Sadece yeni satır karakterinden önce '\\' koyarsanız, çalışmaya başlar. Ama nedenini merak ediyorum? – qazwsx

+0

@ user001 Neye değer, tam olarak aynı komut Ubuntu 11.10'daki bash 4.2.10'da benim için çalıştı. – jcollado

6

sed onun substitu içinde \n kaçış dizisi desteklemiyor siyon komutu, ancak bunu kaçmak eğer gerçek bir satır karakteri desteği yok (sed komutları yalnızca tek bir satırını kullanmalısınız çünkü ve kaçış gerçekten bir satır karakteri istediğinizi sed anlatmak için burada):

$ sed 's/),(/),\\ 
(/g' temp.txt 
(foo), 
(bar) 
(foobar), 
(foofoobar) 

Ayrıca, satırsonu karakterini saklamak için bir kabuk değişkeni de kullanabilirsiniz.

$ NL=' 
' 
$ sed "s/),(/,\\$NL(/g" temp.txt 
(foo), 
(bar) 
(foobar), 
(foofoobar) 

kabuk olarak bash kullanarak, Mac OS X Lion test edilmiştir.

+0

İlk yaklaşımda, neden "\\" değil, "\' değil? – qazwsx

+0

"sed" ye ilettiğiniz komutun yeni satır içermemesi gerekiyor. Yani bir satırsonu geçmek istiyorsanız, bir ters eğik çizgi ile kaçmanız gerekir, bu yüzden, "bilerek" bilerek yaptığını biliyorsun. Ve birincisi kabuğun yorumlanmasından korunmak için ikinci bir ters eğik çizgi gerekir (regexp'deki kaçış karakterine ters eğik çizgi kullanarak IMHO kötü bir fikirdi çünkü genellikle dizgede karakter alıntılamak için kullanılır ve bu yüzden genellikle çift ters eğik çizgi kullanmak zorunda kalırsınız) regexp'de). –