Escapando aspas no alias zsh

12

Após essa pergunta sobre a remoção de novas linhas de texto, desejo transformar isso em um alias zsh da seguinte maneira:

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

Eu tentei escapar das aspas dentro do script awk, mas estou recebendo este erro:

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

(O arquivo é chamado bspsrobustness)

Existe uma maneira de fazer o que eu quero? Suponho que eu poderia transformar isso em um script awk em vez de um apelido zsh, essa é minha melhor opção?

Seamus
fonte
A propósito, isso se aplica a todos os shells (no estilo Bourne, não no csh).
Gilles 'SO- stop be evil'

Respostas:

9

Você poderia usar uma função zsh em vez de um alias. Não há aros para citar.

striplines() {
    awk '... awk body "with quotes" ...' "$@"
}
Glenn Jackman
fonte
E então como eu chamaria isso striplines filename:?
Seamus
você poderia explicar o que "$@"está fazendo?
Seamus
@ Seaus, sim, você chamaria exatamente assim. A "$@"sintaxe envia os argumentos das linhas para despertar imperturbável - necessário se, digamos, qualquer um de seus nomes de arquivos contiver espaços: striplines "file 1" "file 2"enviaria dois nomes de arquivos para despertar.
Glenn Jackman
5

Para ter uma idéia do que está acontecendo, execute

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

Como os $caracteres estão entre aspas duplas (quando são expandidos após a expansão do alias), eles são interpretados pelo shell. Para acertar a citação, é mais fácil colocar toda a definição de alias entre aspas simples. O que há dentro das aspas simples é o que será expandido quando o alias for usado. Agora que o argumento de awkestá entre aspas duplas, fica claro que você precisa de barras invertidas antes \"$.

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

Um idioma útil para citar uma string entre aspas simples é que '\''é praticamente uma maneira de colocar uma aspas simples literal em uma string entre aspas simples. Tecnicamente, há uma justaposição de uma sequência de aspas simples, uma barra invertida 'e outra sequência de aspas simples. A cadeia vazia justaposta ''no final pode ser removida.

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

Após essa longa explicação, uma recomendação: quando for muito complicado para um alias, use uma função .

Gilles 'SO- parar de ser mau'
fonte