0

我正在尝试替换特定的 xml 语句并将其作为注释。我正在尝试一些 linux awk、sed 或任何常规语法表达式,但完全卡住了,无论如何我可以通过它来完成这项任务。下面是我的场景我正在寻找。

例如 ,我有许多 xml 文件。我想替换一个包含“Distribution_Facilities_carrying_Item”一词的语句,并且应该用注释语句替换。假设语句是----

<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 语句。以下是它们可能出现的模式。那么我应该如何去做。我知道需要精通正则表达式,因为这是实现的唯一途径。.................................... 这个语句可以存在于 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

4 回答 4

3

使用sed

sed '/Distribution_Facilities_carrying_Item/ s/<\(.*\)>/<!--\1-->/' inputfile

将注释所有包含字符串的行Distribution_Facilities_carrying_Item

如果要就地修改文件,请添加-i选项:

sed -i '/Distribution_Facilities_carrying_Item/ s/<\(.*\)>/<!--\1-->/' inputfile

如果要对.xml目录中的所有文件执行此操作,请使用findand -exec

find /some/dir -maxdepth 1 -type f -name "*.xml" -exec sed -i '/Distribution_Facilities_carrying_Item/ s/<\(.*\)>/<!--\1-->/' {} \;

(如果要递归执行,请-maxdepth 1从命令中删除。)find

于 2013-08-29T11:30:01.920 回答
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 ;
    }
于 2013-08-29T11:34:00.947 回答
1

检查下面的 sed 方程它会评论

sed -i 's/\(<.*Distribution_Facilities_carrying_Item.*>\)/<!--\1-->/' filename.xml
于 2013-08-29T12:09:47.310 回答
0

一个 awk 版本:

awk '/Distribution_Facilities_carrying_Item/ {sub(/^</,"<!--");sub(/>$/,"-->")}1' a.xml
于 2013-08-29T13:21:52.323 回答