我有一个奇怪的问题,我没有很好的解决办法。
由于某些原因,我的公司将脚本代码存储在数据库表中。别问。每当我必须插入新版本的代码时,我都必须遍历该文件并手动反斜杠所有字符串才能在我的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,您可以安全地将任何字符串转义为一个串联字符串,以便重新输入到 shell,例如:
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")
可能有效。
代码似乎以一种方式进行了转换。如果仅用反斜杠转义单引号和双引号,则很难反转,因为我们不知道要删除哪一个。
可以安全地执行普通和二进制双向转换的更好方法是 base64 编码。
echo \'\"\' \"\'\" \\
'"' "'" \
echo \'\"\' \"\'\" \\ | base64
JyInICInIiBcCg==
echo JyInICInIiBcCg== | base64 -d
'"' "'" \
可以压缩以节省空间。
wc -c /usr/bin/bashbug
6957
gzip < /usr/bin/bashbug | base64 |wc -c
4094