如何在Bash中为指定XML标签添加前置字符串(从文本文件取标签名)
解决方法
推荐方案:用XSLT处理(XML结构化工具,避免正则坑)
XML是结构化文档,用sed这类文本工具容易因为换行、嵌套、属性顺序等问题出错,优先用专门的XML处理工具xsltproc。
步骤1:整理标签名文件
把存储标签名的文本文件(比如命名为categories.txt)改成每行一个名称的格式:
name1 name2 name3
步骤2:自动生成XSLT样式表
用awk读取标签名文件,自动生成匹配指定Category标签的XSLT规则:
awk -v q="'" 'BEGIN{print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">\n <xsl:template match=\"@*|node()\">\n <xsl:copy>\n <xsl:apply-templates select=\"@*|node()\"/>\n </xsl:copy>\n </xsl:template>\n <xsl:template match=\""} {printf "Category[@name=%s%s%s]%s", q, $0, q, NR==FNR?" | ":""} END{print "\">\n <xsl:copy>\n <xsl:apply-templates select=\"@*\"/>\n <xsl:text>VALUE4</xsl:text>\n <xsl:apply-templates select=\"node()\"/>\n </xsl:copy>\n </xsl:template>\n</xsl:stylesheet>"}' categories.txt > add_value.xsl
步骤3:处理XML文件
用xsltproc执行样式表,生成修改后的XML:
xsltproc add_value.xsl 你的XML文件名.xml > 修改后的XML文件名.xml
备选方案:用sed处理(仅适用于结构简单的XML)
如果你的XML结构非常规整(Category标签内容无换行、无嵌套),可以用sed批量生成替换规则:
步骤1:生成sed脚本规则
sed 's/.*/\/<Category name="&">/,\/<\/Category>/s/^\(.*\)/VALUE4\1/' categories.txt | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/;/g' > sed_script.txt
步骤2:执行sed替换
sed -f sed_script.txt 你的XML文件名.xml > 修改后的XML文件名.xml
注意:如果XML中
Category标签存在换行、嵌套或属性顺序变化,这个方法会失效。
内容的提问来源于stack exchange,提问作者LePousson
相关产品推荐
相关产品推荐

