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

How to get sed to include a double \\ that's included in a variable

我正在 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

我已经通读了本网站以及其他网站上的答案。并且找到了很多关于如何包含变量、单引号和双引号的有用信息,但没有关于如何在变量中保留双引号的信息。我想让 sed 正确解释,而不是键入类似;

myDB='serverxyz\\instance'

该值将由解决方案工程师输入,他们可能会输入不当,因为他们无法将其识别为有效的 SQL 实例。

sed 解释正确。

您将 \ 作为文字字符串粘贴在替换中。

sed 不知道它是来自其他地方的变量,而不是手动输入的。

转义答案。

如果你愿意,你可以在扩展时使用 ${myDB//\/\\} 来完成。

此外,正如@abesto 在他的回答中非常正确地指出的那样,您甚至在 sed 看到它之前就失去了双斜线。在您的作业中使用单引号来保留它。

myDB='server\instance'

\ 甚至没有达到 sed 的程度。您的 shell 看到 \,并将其读作 "oh, you want a \, because you escaped it"。您可以这样尝试:

myDB="serverxyz\instance"
echo "$myDB"
# output: serverxyz\instance

总而言之(感谢所有回复者。特别感谢@Etan);

myDB='serverxyz\instance'

sed -i -e "s,@myDB,${myDB//\/\\},g" storage.config

以上代码生成了我的 storage.config 文件的正确 translation\transform。结果storage.config如下;

url=jdbc:sqlserver://serverxyz\instance