我正在用bash编写一个脚本,它执行一个文件的简单转换,我们称之为storage.config。
参数从我们的自动化系统(VCAC \ AppD)传递到我们的动作脚本,该脚本使用sed执行转换。
为了简单起见,我将使用以下示例
storage.config - 待转换
url=jdbc:sqlserver://@myDB
转换脚本
myDB='serverxyz\\instance'
sed -i -e "s,@myDB,$myDB,g" storage.config
我希望生成的storage.config看起来像这样;
url=jdbc:sqlserver://serverxyz\\instance
然而,它看起来像这样;
url=jdbc:sqlserver://serverxyz\instance
我已经阅读了本网站以及其他网站上的答案。并且已经找到了很多关于如何包含变量,单引号和双引号的有用信息,但没有关于如何在变量中保留double \的信息。我想让sed正确解释,而不是输入类似的内容;
myDB='serverxyz\\\\instance'
此值将由解决方案工程师输入,他们可能输入不正确,因为他们不认为它是有效的SQL实例。
答案 0 :(得分:1)
sed
正确解释它。
您将\\
作为文字字符串粘贴在替换中。
sed
并不知道它是来自其他地方的变量,而不仅仅是手动输入。
逃避是的答案。
如果您愿意,可以在展开时使用${myDB//\\/\\\\}
进行此操作。
另外,正如@abesto在他的回答中非常正确地指出的那样,在sed
看到它之前你正在失去加倍的斜线。在作业中使用单引号来保留它。
myDB='server\\instance'
答案 1 :(得分:1)
双\
甚至没有达到sed。你的shell看到\\
,并将其读作“哦,你想要一个\
,因为你逃脱了它”。你可以这样试试:
myDB="serverxyz\\instance"
echo "$myDB"
# output: serverxyz\instance
答案 2 :(得分:0)
总之(感谢所有回复。特别感谢@Etan);
myDB='serverxyz\\instance'
sed -i -e "s,@myDB,${myDB//\\/\\\\},g" storage.config
上面的代码导致了我的storage.config文件的正确翻译\转换。生成的storage.config如下;
url=jdbc:sqlserver://serverxyz\\instance