Escapando aspas no alias do zsh

9

Seguindo a esta pergunta sobre a remoção de novas linhas do texto, quero transformar isso em um alias zsh da seguinte forma:

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

Eu tentei escapar as 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? Eu suponho que eu poderia transformar isso em um script awk ao invés de um apelido zsh, essa é a minha melhor opção?

    
por Seamus 24.02.2011 / 12:16

2 respostas

8

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

striplines() {
    awk '... awk body "with quotes" ...' "$@"
}
    
por 24.02.2011 / 16:02
5

Para ter uma ideia 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 depois que o alias é expandido), eles são interpretados pelo shell. Para obter a citação correta, é mais fácil colocar a definição de alias inteira entre aspas simples. O que está dentro das aspas simples é o que será expandido quando o alias for usado. Agora que o argumento de awk está entre aspas duplas, fica claro que você precisa de barras invertidas antes de \"$ .

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

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

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

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

    
por 24.02.2011 / 21:25