我有一个xml文件,如下所示
<name>abcdefg</name>
<value>123456</value>
我正在尝试使用sed编写一个脚本来搜索标签&#34; abcdefg&#34;然后替换相应的值&#34; 123456&#34;但不幸的是,我无法找到实现上述目标的逻辑。 需要帮助!
答案 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
,定义name
和value
之间的关系):
<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