在XML中搜索键和替换值

时间:2016-09-26 10:26:53

标签: python xml shell replace sed

我有一个xml文件,如下所示

<name>abcdefg</name>
<value>123456</value>

我正在尝试使用sed编写一个脚本来搜索标签&#34; abcdefg&#34;然后替换相应的值&#34; 123456&#34;但不幸的是,我无法找到实现上述目标的逻辑。  需要帮助!

3 个答案:

答案 0 :(得分:2)

使用的样本数据:

 cat key
<name>abcdaaefg</name>
<value>123456</value>
<name>abcdefg</name>
<value>123456</value>
<name>abcdaaefg</name>
<value>123456</value>

sed解决方案:

 sed '/abcdefg/!b;n;c<value>OLA<value>' key

<name>abcdaaefg</name>
<value>123456</value>
<name>abcdefg</name>
<value>OLA<value>
<name>abcdaaefg</name>
<value>123456</value>

用于更改文件。

sed -i.bak '/abcdefg/!b;n;c<value>OLA<value>' key

awk解决方案:

awk '/abcdefg/ {print $0;getline;sub(/>.*</,">ola<")} {print $0}' key
<name>abcdaaefg</name>
<value>123456</value>
<name>abcdefg</name>
<value>ola</value>
<name>abcdaaefg</name>
<value>123456</value>

搜索包含abcdefg的行,然后执行以下操作:
1.打印该行,
2.移动到下一行并将html标记内的值替换为其他内容。在此,我已将123456替换为ola

答案 1 :(得分:0)

只要数据中有tag-&gt;值对,最好在代码中创建tag-&gt;值数组:

$ awk -F'[<>]' '{tag=$2; v[tag]=$3} tag=="value" && v["name"]=="abcdefg" {sub(/>.*</,">blahblah<")} 1' file
<name>abcdefg</name>
<value>blahblah</value>

答案 2 :(得分:0)

使用支持XML的工具。这将使您的方法更加健壮:这意味着文本描述中的微小变化(如添加或删除的换行符或添加到预先存在的元素的额外属性)不会破坏您的脚本。

假设您的输入结构如下所示(在单个父项下,此处称为item,定义namevalue之间的关系):

<config>
  <item><name>abcdef</name><value>123456</value></item>
  <item><name>fedcba</name><value>654321</value></item>
</config>

...你可以这样编辑:

 # edit the value under an item having name "abcdef"
 xmlstarlet ed -u '//item[name="abcdef"]/value' -v "new-value"

如果相反,它就像这样(在描述它们之间关系的名称/值对之间进行排序):

<config>
  <name>abcdef</name><value>123456</value>
  <name>fedcba</name><value>654321</value>
</config>

...然后你可以像这样编辑它:

# update the value immediately following a name of "abcdef"
xmlstarlet ed -u '//name[. = "abcdef"]/following-sibling::value[1]' -v new-value