使用shell函数更新xml文件中的一行

时间:2015-12-15 16:36:26

标签: regex xml shell sed

我正在尝试使用自定义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

}

2 个答案:

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