Citas de escape en alias zsh

12

Siguiendo con esta pregunta sobre la eliminación de nuevas líneas del texto, quiero convertir esto en un alias zsh de la siguiente manera:

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

Intenté escapar de las comillas dentro del script awk, pero recibo este error:

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

(El archivo se llama bspsrobustness)

¿Hay alguna manera de hacer lo que quiero? Supongo que podría convertir esto en un script awk en lugar de un alias zsh, ¿es esa mi mejor opción?

Seamus
fuente
Por cierto, esto se aplica a todos los shells (estilo Bourne, no csh).
Gilles 'SO- deja de ser malvado'

Respuestas:

9

Podría usar una función zsh en lugar de un alias. No hay aros de citas para saltar.

striplines() {
    awk '... awk body "with quotes" ...' "$@"
}
Glenn Jackman
fuente
Y entonces, ¿cómo lo llamaría striplines filename:?
Seamus
¿podrías explicar qué "$@"está haciendo?
Seamus
@Seamus, sí, lo llamarías exactamente así. La "$@"sintaxis envía los argumentos de striplines a awk sin perturbaciones, lo que es necesario si, por ejemplo, alguno de sus nombres de archivo contiene espacios: striplines "file 1" "file 2"enviaría dos nombres de archivo a awk.
Glenn Jackman
5

Para tener una idea de lo que está pasando, corre

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

Dado que los $caracteres están entre comillas dobles (cuando se expanden después de que se expande el alias), son interpretados por el shell. Para que la cita sea correcta, es más fácil poner la definición completa del alias entre comillas simples. Lo que está dentro de las comillas simples es lo que se expandirá cuando se use el alias. Ahora que el argumento de awkestá entre comillas dobles, está claro que necesita barras invertidas antes \"$.

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

Una expresión útil para comillas simples de una cadena entre comillas simples es que '\''es más o menos una forma de poner una comilla simple literal en una cadena entre comillas simples. Técnicamente hay una yuxtaposición de una cadena entre comillas simples, una barra invertida entre comillas 'y otra cadena entre comillas simples. La cadena vacía yuxtapuesta ''al final se puede quitar.

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

Después de esta larga explicación, una recomendación: cuando es demasiado complicado para un alias, use una función .

Gilles 'SO- deja de ser malvado'
fuente