Zsh takma adından kaçan tırnak işaretleri


12

Yeni satırları metinden çıkarmaya ilişkin bu sorudan sonra , bunu aşağıdaki gibi bir zsh takma adına dönüştürmek istiyorum:

alias striplines=' awk " /^$/ {print \"\n\"; } /./ {printf( \" %s \",$0);}"'

Awk betiği içindeki tırnaklardan kaçmayı denedim, ama bu hatayı alıyorum:

awk: (FILENAME=bspsrobustness FNR=1) fatal: division by zero attempted

(Dosya çağrılır bspsrobustness)

İstediğimi yapmanın bir yolu var mı? Sanırım bunu bir zsh takma adı yerine bir awk betiğine dönüştürebilirim, bu benim en iyi seçeneğim mi?


Bu arada, tüm (Bourne tarzı, csh değil) mermileri için geçerlidir.
Gilles 'SO- kötü olmayı kes'

Yanıtlar:


9

Takma ad yerine zsh işlevi kullanabilirsiniz. Atlamak için tırnak yok.

striplines() {
    awk '... awk body "with quotes" ...' "$@"
}

Sonra nasıl diyorum ki striplines filename?
Seamus

ne yaptığını açıklayabilir misiniz "$@"?
Seamus

@Seamus, evet buna aynen böyle derdiniz. "$@": En Filenames boşluk içermemelidir, diyelim ki, eğer gerekli - sözdizimi awk için şerit çizgileri argümanlar rahatsız gönderir striplines "file 1" "file 2"olur awk iki dosya gönderdi.
glenn jackman

5

Neler olduğu hakkında bir fikir edinmek için

% alias striplines='print -lr awk " /^$/ {print \"\n\"; } /./ {printf( \" %s \",$0);}"'
% striplines
awk
 /^$/ {print "\n"; } /./ {printf( " %s ",zsh);}

Yana $karakterler çift tırnak (takma ad genişletilir sonra onlar genişletilmiş yaparken) 'de, onlar kabuk tarafından yorumlanır. Alıntıyı doğru yapmak için, tüm takma adı tanımını tek tırnak içine almak daha kolaydır. Tek tırnak içinde, takma ad kullanıldığında genişletilecek olan şey bulunur. Şimdi argümanı awkçift ​​tırnak içine alındığına göre, daha önce ters eğik çizgi kullanmanız gerektiği açıktır \"$.

alias striplines='print -lr awk " /^\$/ {print \"\n\"; } /./ {printf( \" %s \",\$0);}"'

Tek tırnaklı bir dizeyi tek tırnak içine almak için yararlı bir deyim, tek tırnaklı bir dizeye '\''değişmez tek tırnak koymak için hemen hemen bir yoldur. Teknik olarak, tek tırnaklı bir dizenin, ters eğik çizgili 've başka bir tek tırnaklı dizenin yan yana yerleştirilmesi vardır . Sondaki bitişik boş dize ''kaldırılabilir.

alias striplines='print -lr awk '\'' /^$/ {print "\n"; } /./ {printf( " %s ",$0);}'\'

Bu uzun açıklamadan sonra bir öneri: bir takma ad için çok karmaşık olduğunda bir işlev kullanın .

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.