Ferramenta para escapar de todas as aspas em uma string / arquivo

2

Eu tenho um problema estranho que não tenho um bom caminho.

Minha empresa, por motivos, armazena o código de script em uma tabela de banco de dados. Não pergunte. Sempre que eu tenho que inserir uma nova versão do código, eu tenho que percorrer o arquivo e manualmente backslash todas as seqüências para poder executá-lo na minha declaração insert .

Existe uma ferramenta que irá escapar todas as strings no arquivo para mim, para que eu possa copiar e colar sem ter que fazer este trabalho manual?

O arquivo provavelmente conterá aspas simples e duplas, bem como as aspas entre aspas, ou seja, "this is \"weird\"" .

Veja um exemplo da consulta que estou executando:

delimiter $$
insert into table (code) values ("package a.b.c; 
class SomeClass {
    var thing = "so \"weird\" and thing's stuff"

}");

Eu não preciso de espaços vazados, nem ponto-e-vírgula, mas qualquer coisa que possa quebrar minhas aspas deve ser evitada. O conteúdo da variável thing quebraria minhas citações no exemplo dado acima.

    
por Naftuli Kay 06.02.2015 / 19:31

4 respostas

2

Se você quiser apenas escapar de todas as aspas e contrabarra, poderá usar

perl -wpe 's/([\"])/\$1/g'

Você também pode usar isso com xclip:

cat myfile | perl -wpe 's/([\"])/\$1/g' | xclip -selection clipboard
    
por 06.02.2015 / 20:01
2

POSIXly você pode escapar com segurança de qualquer string em uma string concatenada para reintroduzir o shell como:

alias "string=$(cat file)"; alias string

alias irá citar sua saída e incluir (pelo menos) string= no cabeçalho da string. bash (em um intervalo com o padrão) também adiciona a string alias ao cabeçalho da saída. Ainda assim, você pode obter uma versão com citação de eval de qualquer string como:

string=$(alias "string=$(cat file)"; alias string)
string=${string#*=}

Ou para colocá-lo na sua área de transferência:

<infile sh -c 'alias "c=$(cat)" c' | sed 1s/..// | xsel -bi 
    
por 07.02.2015 / 16:16
0

bash:

> printf %q "this is \"weird\""
this\ is\ \"weird\"

> printf -v var %q "this is \"weird\""
> echo $var
this\ is\ \"weird\"
    
por 06.02.2015 / 19:34
0

O Oracle, o mysql e o sqlite possuem a função quote . var thing = quote("so \"weird\" and thing's stuff") pode funcionar.

Parece que o código é transformado de uma maneira. É muito difícil reverter se apenas aspas simples e duplas são escapadas pela barra invertida, porque não saberíamos qual delas remover.
Uma maneira melhor de executar a transformação bidirecional de modo simples e binário de maneira segura é a codificação base64.

echo \'\"\' \"\'\" \
'"' "'" \
echo \'\"\' \"\'\" \ | base64
JyInICInIiBcCg==
echo JyInICInIiBcCg== | base64 -d
'"' "'" \  

pode ser compactado para economizar espaço.

wc -c  /usr/bin/bashbug
6957
gzip < /usr/bin/bashbug | base64 |wc -c
4094
    
por 07.02.2015 / 21:49