如何让sed包含一个包含在变量中的双\\

时间:2015-01-16 17:58:04

标签: sed

我正在用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实例。

3 个答案:

答案 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