用于转义字符串/文件中所有引号的工具

用于转义字符串/文件中所有引号的工具

我有一个奇怪的问题,我没有很好的解决办法。

由于某些原因,我的公司将脚本代码存储在数据库表中。别问。每当我必须插入新版本的代码时,我都必须遍历该文件并手动反斜杠所有字符串才能在我的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

相关内容