
良い解決策がない奇妙な問題があります。
何らかの理由で、当社はスクリプトコードをデータベーステーブルに保存します。聞かないでください。新しいバージョンのコードを挿入する必要があるときはいつでも、ファイルを繰り返し、ステートメントで実行するためにすべての文字列を手動でバックスラッシュする必要がありますinsert
。
手動で作業せずにコピーして貼り付けることができるように、ファイル内のすべての文字列をエスケープするツールはありますか?
ファイルには、単一引用符と二重引用符だけでなく、引用符内の引用符も含めることができます"this is \"weird\""
。
以下は、私が実行しているクエリの例です。
delimiter $$
insert into table (code) values ("package a.b.c;
class SomeClass {
var thing = "so \"weird\" and thing's stuff"
}");
スペースやセミコロンをエスケープする必要はありませんが、引用符を破る内容はエスケープする必要があります。変数の内容はthing
上記の例の参照を破ります。
答え1
すべての二重引用符とバックスラッシュをエスケープするには、次のようにします。
perl -wpe 's/([\\"])/\\$1/g'
xclipで使用することもできます。
cat myfile | perl -wpe 's/([\\"])/\\$1/g' | xclip -selection clipboard
答え2
POSIXlyでは、シェルに再入力するために、すべての文字列を関連付けられた文字列に安全にエスケープできます。たとえば、次のようになります。
alias "string=$(cat file)"; alias string
alias
出力をハード参照して前に追加します。(少なくとも) string=
文字列の頭の部分に。bash
(標準違反)alias
また、出力ヘッドに文字列を追加します。それでも、eval
すべての文字列についておなじみの引用バージョンを入手できます。たとえば、次のようになります。
string=$(alias "string=$(cat file)"; alias string)
string=${string#*=}
またはクリップボードに入れてください。
<infile sh -c 'alias "c=$(cat)" c' | sed 1s/..// | xsel -bi
答え3
大きな打撃:
> printf %q "this is \"weird\""
this\ is\ \"weird\"
> printf -v var %q "this is \"weird\""
> echo $var
this\ is\ \"weird\"
答え4
Oracle、mysql、sqliteにはすべてquote
機能があります。var thing = quote("so \"weird\" and thing's stuff")
うまくいくかもしれません。
コードが1つの方法で変換されたようです。バックスラッシュを使用して一重引用符と二重引用符をエスケープすると、どのようなものを削除するのかわからないため、元に戻すのは困難です。
双方向で汎用変換とバイナリ変換を安全に実行するためのより良い方法は、base64エンコーディングです。
echo \'\"\' \"\'\" \\
'"' "'" \
echo \'\"\' \"\'\" \\ | base64
JyInICInIiBcCg==
echo JyInICInIiBcCg== | base64 -d
'"' "'" \
スペースを節約するために圧縮できます。
wc -c /usr/bin/bashbug
6957
gzip < /usr/bin/bashbug | base64 |wc -c
4094