我正在尝试替换一个特定的xml语句并将其作为注释。我正在尝试一些linux awk,sed或任何常规语法表达式,但完全被卡住了无论如何我可以实现这个任务.Below is我正在寻找的方案。
例如 我有n个xml文件。我想替换一个单词“Distribution_Facilities_carrying_Item”的语句,并且应该替换为comment语句。 假设声明是----
<Parameter name="RelationshipName1" direction="in" eval="constant" type="string">Distribution_Facilities_carrying_Item</Parameter>
.....因为这句话包含单词“Distribution_Facilities_carrying_Item”我会将此语句替换为注释。所以我希望它被替换为
<!--Parameter name="RelationshipName1" direction="in" eval="constant" type="string">Distribution_Facilities_carrying_Item</Parameter-->
此外,所有xml文件中的所有这样的语句都应该被替换为注释的xml语句.Below是它们可能出现的模式。所以我应该怎么做。我知道一个人需要是一个熟练的正则表达式,因为它是实现的唯一方法。 ...................................... 这个语句可以存在于n个xml文件中。 文件:A.XML
<Parameter name="RelationshipName1" direction="in" eval="constant" type="string">Distribution_Facilities_carrying_Item</Parameter>
<Parameter direction="in" eval="constant" type="string" name="RelationshipName3">Distribution_Facilities_carrying_Item</Parameter>
<Parameter name="RelationshipName" direction="in" eval="constant" type="string">Distribution_Facilities_carrying_Item</Parameter>
<Parameter direction="in" name="RelationshipName10" type="string" eval="constant">Distribution_Facilities_carrying_Item</Parameter>
<Parameter direction="in" name="RelationshipName11" type="string" eval="constant">Distribution_Facilities_carrying_Item</Parameter>
<Parameter direction="in" eval="constant" type="string" name="RelationshipName5">Distribution_Facilities_carrying_Item</Parameter>
提前致谢!!
答案 0 :(得分:2)
使用sed
:
sed '/Distribution_Facilities_carrying_Item/ s/<\(.*\)>/<!--\1-->/' inputfile
会评论包含字符串Distribution_Facilities_carrying_Item
的所有行。
如果要就地修改文件,请添加-i
选项:
sed -i '/Distribution_Facilities_carrying_Item/ s/<\(.*\)>/<!--\1-->/' inputfile
如果要对目录中的所有.xml
个文件执行此操作,请使用find
和-exec
:
find /some/dir -maxdepth 1 -type f -name "*.xml" -exec sed -i '/Distribution_Facilities_carrying_Item/ s/<\(.*\)>/<!--\1-->/' {} \;
(如果您想以递归方式执行此操作,请从-maxdepth 1
命令中删除find
。)
答案 1 :(得分:1)
不要使用正则表达式来解析XML。使用适当的解析器。例如,使用xsh:
my $search = "Distribution_Facilities_carrying_Item" ;
for my $file in { @ARGV } {
open $file ;
for my $p in //Parameter[text() = $search]
xinsert comment { $p->toString } replace $p ;
save :b ;
}
如果您想删除文本,也可以将内部循环更改为
for my $p in //Parameter[text() = $search] {
delete $p/text() ;
xinsert comment { $p->toString } replace $p ;
}
答案 2 :(得分:1)
用下面的sed方程检查它会发表评论
sed -i 's/\(<.*Distribution_Facilities_carrying_Item.*>\)/<!--\1-->/' filename.xml
答案 3 :(得分:0)
awk版本:
awk '/Distribution_Facilities_carrying_Item/ {sub(/^</,"<!--");sub(/>$/,"-->")}1' a.xml