我正在尝试使用自定义shell函数和sed
更新xml文件中的一行在cmd行中,我运行如下: updateloc db_name
然而,它不会更新任何内容。下面的代码示例
Failed to Connect to MySQL at XXXXXX:3306 with user root
HOST 'XXXXXXX' is not allowed to connect to this MySQL server
}
答案 0 :(得分:1)
这项工作的正确工具是XMLStarlet。使用新值修改名为dbname
的任何元素:
updateloc() {
local db_name=$1 file=file.xml
xmlstarlet ed --inplace -u '//dbname' -v "$db_name" "$file"
}
仅使用旧值olddb
替换元素:
updateloc() {
local db_name=$1 file=file.xml
xmlstarlet ed --inplace \
-u "//dbname[. = 'olddb']" -v "$db_name" "$file"
}
请注意,虽然XMLStarlet生成的序列化不一定使用CDATA
,但它保证在语义上等效,并且在任何符合XML的解析器中表现得完全相同。
答案 1 :(得分:0)
1)$ olddb和$ newdb没有扩展,因为它们是单引号
2)你的sed命令被所有那些xml字符绊倒 - '['和'/'对sed都有意义。你必须逃避所有这些,并且可能使用不同的正则表达式分隔符(例如's#$ olddb#$ newdb#g')。除非file.xml的格式非常一致(例如,结束标记可能在一个单独的行上),否则为此使用sed可能是一个坏主意。
那就是说,这适用于你的例子:
olddb='<dbname><!\[CDATA\[olddb\]\]></dbname>'
newdb='<dbname><!\[CDATA\[newdb\]\]></dbname>'
sed -i '' "s#$olddb#$newdb#g" $file
Grep and Sed Equivalent for XML Command Line Processing有一些很好的方法可以更好地从命令行中修改xml。