Sed ile bir dosyadaki tüm satırlar için, bir satırdaki bir desenin ilk tekrarlamasını değiştirme


16

Tek bir astarda yapmak mümkün mü?

Ben böyle bir çıktı var:

"First line" - Description  
" Second line" - Description  
"Third line" - Description  
" Fourth line" - Description  

Bu giriş otomatik olarak oluşturulur.

Her bir satır için "(tırnak işareti + boşluk) ilk oluşumunu (tırnak işareti) ile değiştirmek istiyorum ". Ben global olarak ikame uygularsanız, o da her olay değişecek line" -için line"-o bunu yapmanın sed bir astar kullanmak mümkün olup olmadığını merak ediyorum bu yüzden.

^Böyle kullanmayı denedim

sed -r ':a;N;$!ba;s/(\^\" )/\"/g'

Ama işe yaramıyor, hiçbir şeyin yerini almıyor. denedim

sed -r ':a;N;$!ba;s/(^|\" )/\"/g'

ve tüm olayların yerine geçer. Sed kullanmaya yeni başladım, bu yüzden yanlış bir şey yapıp yapmadığımı gerçekten bilmiyorum.

Burada ne eksik?


Etiketler hakkında bir not: Yukarıda yazdığınız komut, bazı uygulamalarda işe yarayabilir sed, ancak taşınabilirlik ve gerçekten garip hatalardan kaçınmak için, bir etiketin ardından belirli bir komut bağımsız değişkenini sonlandırmanız gerekir (bunlara ihtiyacınız varsa). Örn,sed -e ':a' -e 'N;$!ba' -e 'whatever'
Wildcard

Yanıtlar:


34

Çok düşünüyorsun. sedbir satırdaki yalnızca ilk örneği varsayılan olarak /gdeğiştirir ( değiştirici olmadan ), ancak yine de tutturmak istediğiniz için çapa istemeniz gerekir; satırdaki ilk örneği satırın başındaki örnek olarak istemezsiniz; ve genellikle kullanmaya çalıştığınız açık satır işlemlerine ihtiyacınız yoktur (neden?).

sed 's/^" /"/'

Teşekkürler! Bir dosya üzerinde çalışırken satır eylemlerini açık bir şekilde bildirmenin, onu okumanın ve kullanmaya devam etmenin gerekli olduğunu düşündüm. Gerçekten çok düşünmüştüm, bu daha basit olamazdı ve hile yapar :)
Steve B.

Bu komutların çok eski olduğunu söylemeye can atıyorum; onlarla oldukça karmaşık çok satırlı şeyler yapmak mümkündür, ancak bunu yapmak kolay değildir ve bugünlerde bunun yerine perl / python / ruby ​​/ kullanmaktan daha iyi olursunuz.
geekosaur

Yukarıdaki yoruma tamamen katılmıyorum; çok hatlı sedgibi komutları Nolarak ve bu tür etiketleri :ahiç eskimiş değildir ve onlar vardır taşınabilir ve POSIX belirtilen / ne olursa olsun Perl / Python / Ruby aksine. Bununla birlikte, sık sık ihtiyaç duyduğunuzu görürseniz, öğrenmelisinizawk .
Wildcard

2

Daha genel bir cevap, çünkü geekosaur'un cevabı hakkında yorum yapamam - ^ (satır başlığının) koymazsınız. Örneğin, A'nın ilk oluşumunu B ile değiştirmek isterseniz,

sed 's/A/B/'
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.