【问题标题】:sed multiline range matchsed 多行范围匹配
【发布时间】:2011-08-08 07:12:50
【问题描述】:

我正在尝试进行多行 sed 范围匹配。我的意思是范围的开头本身就是多行。源码是这样的

<filter-mapping>
        <filter-name>Cache Filter - Resource</filter-name>
        <url-pattern>*.css</url-pattern>
</filter-mapping>
<filter-mapping>
        <filter-name>Cache Filter - Resource</filter-name>
        <url-pattern>*.html</url-pattern>
</filter-mapping>
<filter-mapping>
        <filter-name>Cache Filter - Resource</filter-name>
        <url-pattern>*.js</url-pattern>
</filter-mapping>
<filter-mapping>
        <filter-name>Cache Filter - Resource JSP</filter-name>
        <url-pattern>*.jsp</url-pattern>
</filter-mapping>

唯一唯一标识范围开始的段是整个前三行,范围的结束由整个最后两行标识。

有没有办法指定多行模式来开始范围匹配?

【问题讨论】:

  • 你想匹配什么?显示你的输出。
  • 我想匹配整个块。 (原始输入文件较大)。

标签: xml regex sed


【解决方案1】:

最好的 sed 在线教程涵盖了这个主题: http://www.grymoire.com/Unix/Sed.html#uh-51

如果您是 sed 的新手,您可能希望从页面开始,如下所示: http://www.grymoire.com/Unix/Sed.html#uh-47

【讨论】:

    【解决方案2】:

    您最好使用perl -0777 -pe 's/.../.../' 执行此操作,或者使用适当的解析器。

    不要使用sed。真的。

    【讨论】:

    • 好的,如果我不知道 sed,我会看看那个。我认为不需要解析器,因为我只是匹配一个常量(多行)字符串,而不是解析 xml。 xml 不是常规语言这一事实​​并不重要。
    【解决方案3】:

    好的,所以我选择了 tchrist 的解决方案并改用 perl。 这是我的正则表达式的样子(在这个例子中,我注释掉了 xml)。我也在做文件的内联替换。

    perl -0777 -pi -e 's|([\t ]*<filter-mapping>\s*<filter-name>Cache Filter - Resource</filter-name>\s*<url-pattern>\*\.css[^\0]*<filter-name>Cache Filter - Resource JSP</filter-name>\s*<url-pattern>\*\.jsp</url-pattern>\s*</filter-mapping>)|<!-- \1 -->|g' inputfile
    

    【讨论】:

      【解决方案4】:

      使用 Pearl 方法(谢谢!这很有用),我只能使用 s 修饰符执行多行匹配。

      由于我在 Tomcat 的 web.xml 中使用它来替换参数,因此我将我的 bash 脚本的副本放置给任何感兴趣的人(欢迎使用 cmets)。

      #!/bin/bash
      if [[ -z "$3" ]] ; then
              echo "Sets a Tomcat web.xml parameter with a new value"
              echo "SINTAX: $0 PARAM_NAME NEW_VALUE FILE"
              exit 1
      fi
      
      PARAM_NAME="$1"
      NEW_VALUE="$2"
      FILE="$3"
      
      perl -0777 -pi -e  "s|(<param-name>${PARAM_NAME}</param-name>.*?<param-value>).*?(</param-value>)|\${1}${NEW_VALUE}\${2}|s" ${FILE}
      

      注意:\${1} 部分是这样完成的,因为 ${NEW_VALUE} 可能是一位或多位数字,它会混淆 perl。

      【讨论】:

      • 这是将 MY_PARAM_VALUE 更改为 XML 中的其他内容,如下所示: MY_PARAMMY_PARAM_VALUE
      【解决方案5】:

      这里是使用sed的多行处理:

      sed ' /<filter-mapping>/,/<[/]filter-mapping>/{/filter-mapping/d}' FILE
      

      这仅打印过滤器映射之间的文本

      <filter-mapping>
              TEXT
      </filter-mapping>
      

      我不太清楚你想做什么......

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-20
        相关资源
        最近更新 更多