2009-11-20 7 views
8

İlk satırdan biriyle dönmek ve erken çıkmak için sed kullanmak nasıl?

'den

How to use sed to replace only the first occurrence in a file?

gördüm Ne istediğimin çoğu için:

sed -n '0,/.*\(something\).*/s//\1/p' 

Bu, bir şeyin ilk eşleşmesini bulur ve onu çıkarır (tabiki benim gerçek örneğim daha karmaşıktır) . Sed'in erken kalkmasını sağlayacak bir 'bırak' komutu olduğunu biliyorum, ama istediğim davranışı elde etmek için 'q' ile yukarıdaki satırı birleştirmeyi bilmiyorum.

Bazı örneklerde gördüğümüz gibi, 'p' yi {p; q;} ile değiştirmeyi denedim, ancak bu açıkça çalışmıyor.

+0

Ne aldığınızı ve ne istediğinizi ve nasıl farklı olduklarını gösterir misiniz? "Echo -e" aaa 111 aaa \ nbbb 111 bbb "| sed -n '0, /. * \ (111 \). */S // \ 1/p' 'yazdım ve bir tane" 111 "aldım. Sonra ben eko -e aaa 111 aaa \ nbbb 111 bbb "| sed -n '0,/\ (. * \ (111 \). * \)/S // \ 1/p' Tam olarak ne elde ettiğini ve "aaa 111 aaa" çıktısını aldığımdan emin olmak istedim. 'Q' kullanmıyorum dikkat edin. Senin için nasıl "çalışmıyor". –

+0

Sizin yönteminiz doğru çıktıyı üretir, ancak daha fazla iş olmamasına rağmen dev dosyanın tamamı için veya bir boru hattında kullanıldığında, dosyanın tamamını işlemeye devam eder.Benim özel kullanım durumum, son işlem için dalın kullanıldığı bir git-p4 içe aktarılmış ağaçta 'git log' ile bulmaktı. git log (-n olmadan çağrıldığında, her bir işlemin günlüğe kaydedileceği kaydediliyor (yüzlerce binlerce benim için). '-n' için gitmenin ne değeri verileceğini bilemeyiz. Benim çözümüm: git günlük | -n '0, /. * \ [git-p4:. * \/\/depo \/blah \/\ ([^ \ /] * \) \ /.*/ s // \ 1/p;/\ [git-p4/q ' – nosatalian

cevap

3

son tamamlama kullanıldı aval aval. git log (-n olmadan çağrıldığında, her bir işlemin (her birimde yüzbinlerce)) kaydedilmesi gerekir.

'-n' için gitme değerini vermenin ne anlama geldiğini bilemeyiz.

git log | sed -n '0,/.*\[git-p4:.*\/\/depot\/blah\/\([^\/]*\)\/.*/s//\1/p; /\[git-p4/ q' 
Hala olmayan bir '/' ayırıcı ile bunun nasıl bilmek istiyorum

ve iki kez 'git-p4' bölümünü belirtmek zorunda kalmadan: Bu gönderdikten sonra, ben benim çözüm buldu Bir kez çıkarma için ve bir kez çıkış için. Aynı çizgide birleştirmek için bir yol var ...

1

Sed genellikle, yürütmek için birden fazla desen belirtme seçeneğine sahiptir (IIRC, -e seçeneği). Bu şekilde, ilk satırdan sonra çıkacak ikinci bir desen belirtebilirsiniz.

Başka bir yaklaşım, ilk satırı (sed '1q') ayıklamak için sed kullanmaktır, daha sonra bunu ikinci bir sed komutuna (yukarıda gösterdiğiniz gibi) verin.

1

kullanımı Benim özel kullanım vaka dalı perforce bir git-p4 ithal ağaç üzerinde 'git log' aracılığıyla öğrenmekti

gawk '/MATCH/{ 
      print "do something with "$0 
      exit 
}' file 
9

"Yazdırma ve çık" hilesi, eğer yerine koyma komutunu da bloğa koyarsanız (yalnızca baskıyı koymak ve çıkmak yerine) çalışır).

Dene:

sed -n '/.*\(something\).*/{s//\1/p;q}' 

böyle Oku: Match eğik çizgiler arasında belirli bir model için. Bu kalıp bulunursa, blokta belirtilen eylemleri yürütün: Değiştir, yazdır ve çık. Tipik olarak, eşleşme ve ikame kalıpları eşittir, ancak bu gerekli değildir, bu yüzden '' komutu aynı zamanda farklı bir RE içerebilir.

Aslında, bu, ghostdog74 gawk için yanıtlanana oldukça benzer.

+0

OpenBSD, quit ('q') komutundan sonra noktalı virgül gerektirir. –

İlgili konular