【问题标题】:Replacing particular occurrence of a string with comment用注释替换特定出现的字符串
【发布时间】:2013-08-30 15:14:37
【问题描述】:

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

例如 我有 n 个 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>

提前致谢!!

【问题讨论】:

    标签: regex linux unix sed awk


    【解决方案1】:

    使用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-->/' {} \;
    

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

    【讨论】:

    • 这会增加额外的数据。请求的 O/P &lt;!--Par 你的 O\P &lt;!--&lt;Par
    • @devnull 你这个摇滚人!!谢谢你。我在哪里可以了解正则表达式,尤其是删除 Distribution_Facilities_carrying_Item 前面的任何内容的部分。我的意思是字符串 s/// 部分。
    • @NishitaPatwardhan \1 是反向引用。 This sed 手册的一部分解释了它。
    • 为了进一步阐述,sed 表达式对匹配 Distribution_Facilities_carrying_Item 的行执行替换。
    • 谢谢!!......还有更多问题......如果我不想添加任何评论,只需将 null 替换为“Distribution_Facilities_carrying_Item”
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      不要使用正则表达式来解析 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 ;
          }
      

      【讨论】:

      • 非常感谢我会调查它!
      • 只有一个修改提示,如果我想删除“Distribution_Facilities_carrying_Item”,即代替 我应该得到 。基本上这里都被“null”代替了。
      • 嘿thanx....但它给了我一个错误 cd 工作流,因为我的 $p in //Parameter[text() = $PROCUREMENT_LV_DF_SOI] { delete $p/text() ;新插入评论 { $p->toString } 替换 $p ;我正在使用 unix 并且有一个工作流目录,其中包含 40 多个文件,包括子目录}
      • error here:./removeRelation.sh: line 4: syntax error near unexpected token $p' ./removeRelation.sh: line 4: for my $p in//Parameter[text() = $PROCUREMENT_LV_DF_SOI] {' 其中第 4 行是对于我的 $p in//Parameter[text() =
      • @NishitaPatwardhan:脚本必须在xsh 中运行,而不是sh
      【解决方案4】:

      一个 awk 版本:

      awk '/Distribution_Facilities_carrying_Item/ {sub(/^</,"<!--");sub(/>$/,"-->")}1' a.xml
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-27
        • 2021-05-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-09
        相关资源
        最近更新 更多