用注释替换字符串的特定匹配项

时间:2013-08-29 11:22:36

标签: regex linux unix sed awk

我正在尝试替换一个特定的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>

提前致谢!!

4 个答案:

答案 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