Citazioni di escape in alias zsh


12

Sulla scia di questa domanda sull'eliminazione di nuove righe dal testo, voglio trasformarlo in un alias zsh come segue:

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

Ho provato a sfuggire alle virgolette all'interno dello script awk, ma sto ricevendo questo errore:

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

(Il file si chiama bspsrobustness)

C'è un modo per fare quello che voglio? Suppongo di poterlo trasformare in uno script awk piuttosto che in un alias zsh, è la mia migliore opzione?


A proposito, questo vale per tutte le shell (stile Bourne, non csh).
Gilles 'SO- smetti di essere malvagio' il

Risposte:


9

È possibile utilizzare una funzione zsh anziché un alias. Nessun cerchio di citazioni da saltare.

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

E poi come lo chiamerei striplines filename:?
Seamus,

potresti spiegare cosa "$@"sta facendo?
Seamus,

@Seamus, sì, lo chiameresti esattamente così. La "$@"sintassi invia gli argomenti di stripline a awk indisturbati - necessario se, per esempio, uno dei tuoi nomi di file contiene spazi: striplines "file 1" "file 2"invierebbe due nomi di file a awk.
Glenn Jackman,

5

Per avere un'idea di quello che sta succedendo, corri

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

Poiché i $caratteri sono tra virgolette (quando vengono espansi dopo l'espansione dell'alias), vengono interpretati dalla shell. Per ottenere la quotazione corretta, è più semplice inserire l'intera definizione di alias tra virgolette singole. Ciò che è racchiuso tra virgolette singole è ciò che verrà espanso quando viene utilizzato l'alias. Ora che l'argomento di awkè racchiuso tra virgolette doppie, è chiaro che prima hai bisogno di barre rovesciate \"$.

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

Un linguaggio utile per virgolette singole su una stringa a virgolette singole è che '\''è praticamente un modo per inserire una virgoletta singola letterale in una stringa a virgolette singole. Tecnicamente c'è una giustapposizione di una stringa tra virgolette singole, una barra rovesciata 'e un'altra stringa tra virgolette singole. La stringa vuota giustapposta ''alla fine può essere rimossa.

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

Dopo questa lunga spiegazione, una raccomandazione: quando è troppo complicato per un alias, usa una funzione .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.