Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 特定标记名上的Grep XML字符串和替换文本值_Bash_Perl_Awk_Sed_Grep - Fatal编程技术网

Bash 特定标记名上的Grep XML字符串和替换文本值

Bash 特定标记名上的Grep XML字符串和替换文本值,bash,perl,awk,sed,grep,Bash,Perl,Awk,Sed,Grep,如何使用文本property1为元素创建一个XML字符串grep,然后替换下一个元素的文本内容 <property> <name>property1</name> <value>7200</value> </property> 物业1 7200 期望值为1000后的期望视图: <property> <name>property1</name> <value>

如何使用文本
property1
为元素
创建一个XML字符串
grep
,然后替换下一个
元素的文本内容

<property>
  <name>property1</name>
  <value>7200</value>
</property>

物业1
7200
期望值为1000后的期望视图:

<property>
  <name>property1</name>
  <value>1000</value>
</property>

物业1
1000

它是XML,因此
grep
对于该工作来说是错误的工具。正则表达式通常不是上下文的,而XML是上下文的

使用解析器:

#!/usr/bin/env perl

use strict;
use warnings;
use XML::Twig;

my $xml = XML::Twig -> new -> parse (\*DATA);
my $matching_property = $xml -> get_xpath('//property/name[string()="property1"]/..',0);

$matching_property -> first_child('value') -> set_text('1000');

$xml -> set_pretty_print ('indented_a');
$xml -> print;

__DATA__
<property>
<name>property1</name>
<value>7200</value>
</property>
#/usr/bin/env perl
严格使用;
使用警告;
使用XML::Twig;
my$xml=xml::Twig->new->parse(\*数据);
我的$matching_property=$xml->get_xpath('//property/name[string()=“property1”]/..,0);
$matching_property->first_child('value')->set_text('1000');
$xml->set_pretty_print('indented_a');
$xml->print;
__资料__
物业1
7200

这使用了与正则表达式类似的
xpath
,不同之处在于它是上下文敏感的,并且“工作”于XML元数据

这意味着XML中有多个
元素。请展示完整XML文档的代表性示例。如果你自己努力解决这个问题,情况也会好得多:如果你自己无法解决问题,那么试图免费完成工作是不好的做法:阅读。@RavinderSingh13:请始终测试你作为答案提交的任何内容。如果您确信某些内容是正确的,但无法测试,那么您必须在帖子中这样说。@Ravinder:您应该意识到OP只显示了XML数据的一部分:他们要求
grep
一个特定的
元素。如果您相信XML工具会更好,那么您应该这么说。“我删除了,因为xml工具更适合这种问题”这是一个奇怪的想法。为什么要删除大量的XML?@Ravinder:你不应该道歉:只是希望你对你发布的任何内容负责,你应该注意你所说的话。我不确定
xmlstarlet
会有多大帮助,但一定要尝试一下。最好使用定义XML、XPath、XSLT等的RFC文档。谷歌搜索会为您找到它们。请显示您的问题。我们这里的大多数人都很乐意帮助您改进您的技能,但不太乐意担任短期无薪编程人员。向我们展示你迄今为止的工作,你期望的结果和你得到的结果,我们将帮助你找出答案。重新阅读可能会有所帮助。我知道您更喜欢在间接寻址运算符周围加空格,但这会使我和其他许多人更难阅读您的代码。运算符
->
已经比大多数运算符长,在下一个操作数之前将其转换为四个字符的间距太大:它变得与通常的四个缩进空格一样大。您甚至已经到达了SO代码块的右边距,这是个坏消息。