使用AWK编辑XML文件

时间:2015-08-19 23:01:00

标签: xml bash awk

我有一个带有一些空元素字段的xml文件,即

<elementA></elementA>

我正在编写一个bash脚本,用一个用户指定的值填充空字段并将其保存为新的xml文件。

awk "{gsub("<elementA></elementA>", "$XMLVALUE", $0); print $0)" $EMTPYFILE > $NEWFILE
#$EMPTYFILE is a bash variable containing file path of xml file containing emtpy fields
#$NEWFILE is a bash variable file path of new xml file with redirected output from awk
#$XMLVALUE is a bash variable containing the value to be inserted into the field.

输出应该是原始的xml文件,但填充了$ XMLVALUE的值。

但是我会遇到各种不同的错误,具体取决于我是使用单引号还是双引号。我认为问题是awk和bash有多个级别的解析,我正在混合正确处理bash变量vs awk变量和使用/。

1 个答案:

答案 0 :(得分:3)

awk是这项工作的错误工具。

  • 如果没有为每个值执行工作,它就无法转义值以使其成为有效的XML(将Yellow & Blue更改为Yellow &Amp; Blue,或3<4更改为3&lt;4)需要如此逃脱。
  • 无法识别注释,CDATA部分或其他XML语法。
  • 无法保证执行编辑后的输出有效,符合XML。

相反,请使用XMLStarlet

xmlstarlet ed -u '//elementA' -v "$value" <in.xml >out.xml

也就是说,为了安全地将shell变量的值传递给awk,请使用-v

# Don't actually use this for XML!
awk -v in_string="$in_string" -v out_string="$out_string" \
  '{gsub(in_string, out_string); print}' \
  "$in_file" > "$out_file"

但是,如果你想让awk处理文字,那么即使这样也不够好。请参阅BashFAQ #21中提供的gsub_literal功能。