【发布时间】:2014-09-13 10:36:21
【问题描述】:
我们的脚本中有一个 sed 命令,用变量中的值替换文件内容
例如..
export value="dba01upc\Fusion_test"
sed -i "s%{"sara_ftp_username"}%$value%g" /home_ldap/user1/placeholder/Sara.xml
sed 命令会忽略特殊字符,如 '\' 并用不带 '\' 的字符串“dba01upcFusion_test”替换 如果我像 export value='dba01upc\Fusion_test' ('\' 用 '' 包围)那样进行导出,它可以工作。但不幸的是,我们的客户想要用单引号/双引号导出原始文本 dba01upc\Fusion_test 而他没有'不想在文本中添加任何额外的字符。 谁能告诉我如何让 sed 放置带有特殊字符的文本..
替换前:Sara.xml
<?xml version="1.0" encoding="UTF-8"?>
<ser:service-account >
<ser:description/>
<ser:static-account>
<con:username>{sara_ftp_username}</con:username>
</ser:static-account>
</ser:service-account>
替换后:Sara.xml
<?xml version="1.0" encoding="UTF-8"?>
<ser:service-account>
<ser:description/>
<ser:static-account>
<con:username>dba01upcFusion_test</con:username>
</ser:static-account>
</ser:service-account>
提前致谢
【问题讨论】:
-
仅供参考,BashFAQ #21 包含一个可用于可靠替换的 awk 脚本;见mywiki.wooledge.org/BashFAQ/021
-
不需要导出不需要从子进程访问的变量......对于保存密码/凭证的变量,导出它们只是一个坏主意(它已修复在大多数非常新的UNIX 喜欢,但一些较旧的系统使环境变量以与命令行相同的方式公开可见)。
-
wrt 引用的 awk 脚本,如果您在 arg 列表中传递字符串而不是从中填充变量,则不需要转义反斜杠。无论如何,我不相信盲目地逃避每个反斜杠是安全的,但我可能是错的——有一天当我无事可做时,我实际上会尝试看看我是否能想出一个反例。
-
@CharlesDuffy:在链接的
awk脚本中,除了需要转义反斜杠之外,输入字符串中还存在实际换行符的问题,这在使用 BSD @987654327 时会破坏命令@ (据我了解,这种行为可能符合 POSIX)。在@Ed's answer 中使用传递字符串作为伪文件名技术可以避免这个问题,同时也避免了转义的需要。