您好,有人可以帮我吗,我正在尝试替换 tomcat server.xml 文件中的值用户名使用 sed 命令
<Resource username="user1" password="xxxxxxxx"/>
下面的命令按预期替换值,但在值周围缺少“”,因为我从变量 U 中获取值。
export U="userx"
sed -i -E 's/(username=)([a-zA-Z0-9"-])+/\1'"$U"'/g' server.xml
输出 userx 周围缺少“”: <Resource username=userx password="xxxxxxxx"/>
如果我使用值而不是变量,它也可以与“”一起使用
sed -i -E 's/(username=)([a-zA-Z0-9"-])+/\1"userx"/g' server.xml
ouput: <Resource username="userx" password="xxxxxxxx"/>
答案1
使用 编辑 XMLsed
很容易失败。请改用 XML 编辑工具。例如,有了xmlstarlet
它就变得微不足道
U='userx'
xmlstarlet edit --inplace --update '//Resource/@username' --value "$U" server.xml
--inplace
就我个人而言,在测试完替代品是否有效之前我不会使用。
xmlstarlet
通常可以从您的发行版的包管理器中获得。如果您没有它并且无权安装它,请向变更委员会提交请求以进行安装。这是关于使用正确的工具完成正确的工作。
sed
顺便说一句,您的命令不起作用的原因是它从未看到您想要包含的双引号。这是带有一些注释的原始命令
sed -E 's/(username=)([a-zA-Z0-9"-])+/\1'"$U"'/g' ^single quotes start ^single quotes end ^double quotes start ^double quotes end
shell 使用引号来标识如何解析(或不解析)字符串。单引号提供字符的文字序列。双引号保护大多数字符,但特别允许对变量进行求值。该命令(sed
在本例中)永远不会看到这些外部引号。因此,要在字符串中包含双引号,您需要引用它们。
为了可读性但语法准确性不高我已在引号中拆分了更正后的单个表达式
sed -E 's/(username=")([a-zA-Z0-9-])+/\1' "$U" '"/g'
^literal text used as an RE
^variable (quoted to protect it from the shell)
^more literal text
再次将其放在一起,以便sed
看到单个表达式字符串,
sed -E 's/(username=")([a-zA-Z0-9-])+/\1'"$U"'"/g'