如何使用 unix 命令用存储在变量或文件中的一组行替换 xml 文件中的一行?

如何使用 unix 命令用存储在变量或文件中的一组行替换 xml 文件中的一行?

我有一个 xml 文件

其中需要搜索的行是:

SEARCH='<?xml version="1.0" encoding="UTF-8" standalone="no"?><SSC>'

这个搜索到的值需要替换为以下变量中的值,或者也可以存储在另一个文件中:

REPLACE='<?xml version="1.0" encoding="UTF-8" standalone="no"?><SSC><ErrorContext><CompatibilityMode>0</CompatibilityMode><ErrorOutput>1</ErrorOutput>.......some more tags.....</MethodContext>
'

如何使用 SED 或 AWK 等 unix 命令来完成此操作?(这里需要将 SEARCH 替换为 REPLACE。

答案1

是的,可以使用 sed 来完成,但我同意 Jens 的观点。我建议使用适当的工具(如 python + lxml 库)来搜索和替换标签。

答案2

据我所知,需要转义的字符是:

awk '/<\?xml version="1.0" encoding="UTF-8" standalone="no"\?><SSC>/ {print "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?><SSC><ErrorContext><CompatibilityMode>0</CompatibilityMode><ErrorOutput>1</ErrorOutput>.......some more tags.....</MethodContext>"}' <<< '<?xml version="1.0" encoding="UTF-8" standalone="no"?><SSC>'
  • 在搜索字段中:您想用 \? 来转义 ? 字符
  • 在 REPLACE 字段中:你想用 \ 来转义“字符

或者如果您需要使用变量,也可以在搜索字段中转义“并转义字符两次,一次存储在变量中,两次回显!

SEARCH_escaped=`sed -e 's/\?/\\\?/g' -e 's/\"/\\\"/g' <<< $SEARCH`
REPLACE_escaped=`sed 's/\"/\\\"/g' <<< $REPLACE`

awk "/$SEARCH_escaped/ {print \"$REPLACE_escaped\"}" <<< $SEARCH

相关内容