Existe uma maneira de escapar aspas simples no shell?


11

Por exemplo. eu quero dizer

perl -e 'print '"'"'Hello, world!'"'"', "\n";'

Existe uma maneira menos complicada de fazê-lo, por exemplo, escapar aspas simples?

Sim, eu sei que sei escrever

perl -e 'print q[Hello, world!], "\n"'
perl -e 'print "Hello, world!\n"'

Mas essa pergunta é sobre citar no shell, não no Perl.

Estou interessado em como fazê-lo bashe cshem primeiro lugar.

Respostas:


9

Dennis aponta as alternativas usuais em sua resposta (seqüências de caracteres simples, duplas, duplas, simples, concatenadas com aspas simples escapadas; você já mencionou os operadores de cotação personalizáveis ​​de Perl), mas talvez essa seja a resposta direta que você estava procurando para.

Em shells tipo Bourne (sh, ksh, ash, dash, bash, zsh, etc.), as seqüências de citação simples são completamente literais. Isso facilita a inclusão de caracteres que o shell trataria especialmente sem precisar escapar deles, mas significa que o próprio caractere de aspas simples não pode ser incluído em seqüências de caracteres entre aspas simples.

Eu me recuso a pensar sobre os shells do tipo csh, pois eles são totalmente quebrados em outros aspectos (consulte Programação em Csh considerada prejudicial ).


Obrigado. "Isso é impossível" - é a resposta que eu esperava :) Embora eu sempre esperasse que fosse aqui os documentos dedicados a desempenhar esse papel.
codeholic

Diferentemente do Perl, os documentos do shell tipo Bourne aqui são apenas diretamente úteis para fornecer informações via stdin. Você pode, é claro, colocar aspas simples nelas. Você também pode ativar o "modo literal" de um documento aqui, citando a palavra: (por exemplo) blah <<\EOF … EOF. Você também pode usar <<'EOF'e <<"EOF. Todos eles significam documentos literais aqui (diferentemente do Perl). Se você estivesse realmente determinado, poderia fazê-lo blah "$(cat<<\EOF … EOF )" other args(usando novas linhas onde escrevi espaços na substituição de comando; ksh e zsh podem ficar sem o gato , os outros precisam). Mas valeria mesmo a pena?
precisa

Só quero observar que as aspas simples do zsh não são muito literais. O Zsh tentará interpretar um '\ U' em qualquer lugar de uma string de aspas simples como um código de caractere, por exemplo, echo '\U0000068\U000069'ecoa 'hi'. Não sei por que, a menos que seja um bug no shell.
Matthew

1
@ Matthew: A interpretação \Unesse caso está sendo feita pelo comando de eco-E interno (esse comportamento pode ser controlado por ou pela opção BSD_ECHO e -e). Você pode ver que a cadeia literal é passada (e não interpretada de outra forma) em outros comandos; por exemplo printf %s\\n '\U0000068\U000069'.
31813 Chris Johnsen

@ ChrisJohnsen Obrigado, sou novo no zsh e não percebi isso, mas você está certo. A página de manual me disse que -e é o padrão, mas o zsh deve substituir isso.
Mateus

5

Para mim, todos os seus exemplos produzem:

Olá Mundo!

E o mesmo acontece:

perl -e 'print "Hello, world!", "\n";'

E isto:

perl -e 'print '\''Hello, world!'\'', "\n";'

Você pode esclarecer o que está tentando fazer?

No shell, como o Bash, se você desejar imprimir aspas como parte da sequência, um tipo de aspas escapará do outro.

$ echo '"Hello, world!"'
"Hello, world!"
$ echo "'Hello, world!'"
'Hello, world!'

Editar:

Aqui está outra maneira:

$ perl -e 'print "\047Hello, world!\047", "\n";'
'Hello, world!'
$ echo -e "\047Hello, world! \047"
'Hello, world! '

O espaço após o ponto de exclamação evita um erro de expansão do histórico. Eu poderia ter feito set +H.


1

Não tenho certeza se minha edição da resposta anterior seria exibida:

Colando o mesmo que uma nova resposta:

Abordagem alternativa:

Quando tentei sua solução, ainda não consegui imprimir o '.

Mas peguei a sugestão da sua solução e tentei o seguinte:

$ perl -e '$foo = chr(39); print "${foo}Hello, world ${foo}", "\n";'
'Hello, world '

O valor ASCII de 'é 39.

Eu precisava disso para fazer uma edição embutida em vários arquivos para adicionar 'em um local de interesse.


1

Aqui, o documento é a melhor maneira de não se importar com a fuga:

$ cat <<EOF
my $var = "Hello";
print $text, ', world!', "\n";'
EOF

Você pode inibir completamente toda a expansão usando o documento citado aqui:

$ cat <<'EOF'
my $var = "Hello";
print $text, ', world!', "\n";'
EOF

Se você deseja passá-lo como argumento, em vez de entrada, você pode usar xargs:

$ xargs -0 <<'EOF' perl -e
my $var = "Hello";
print $text, ', world!', "\n";'
EOF

0

Não sei se existe uma opção para fazer isso no bash, mas com o zsh você pode usar ''depois de ativar a RC_QUOTESopção. (Eu recomendaria tentar o zsh; é principalmente compatível com o bash e pode emular o bash para ainda mais compatibilidade.)

Com o bash (e ainda na maioria das vezes com o zsh), eu apenas uso '\''porque é mais fácil de ler do que '"'"'.

Não tenho absolutamente nenhuma idéia de como fazê-lo no csh.


-1

Você pode usar \ 'e \ "para escapar de aspas com perl se usado internamente como parte de um script perl. Não tenho certeza se a linha de comando aceitará isso. Você pode tentar e ver se funciona.


3
Se fosse tão fácil, eu não perguntaria. Você pode tentar e ver se funciona antes de postar uma resposta.
#
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.