Sed表达式匹配这个多行代码?

时间:2018-03-21 15:54:59

标签: sed

假设以下代码段:

  <head>
     <script>....</script>
     <script>....</script>
  </head>
  <body>
    <script>
      some stuff
      a change
      more stuff
      more changes
      more stuff
            }
          }
        }
      }
     final changes
    </script>
  </body>

我需要在最后</script>之前添加一些内容,即final changes。我怎么能告诉sed匹配那个? final changes不存在,脚本的最后几行就像四个或五个},因此情况就是这样,我需要匹配多行。

所有其他更改都替换为匹配该行,然后替换为line + the changes。但我不知道如何匹配多行以将</script></body>替换为final changes </script></body>

我尝试使用我用于替换多行的相同策略,但它不起作用,继续报告unterminated substitute pattern

sed 's|</script>\
   </body>|lalalalala\
   </script>\
   </body>|' file.hmtl

我已经阅读了这个问题Sed regexp multiline - replace HTML,但它不适合我的特定情况,因为它匹配搜索选项之间的所有内容。我需要匹配一些东西,然后在第一个搜索运算符之前添加一些东西。

2 个答案:

答案 0 :(得分:1)

sedgrepawk等不适用于XML / HTML处理。
使用正确的XML / HTML解析器。

xmlstarlet 就是其中之一 示例file.html

<html>
<head>
     <script>....</script>
     <script>....</script>
  </head>
  <body>
    <script>
      var data = [0, 1, 2];
      console.log(data);
    </script>
  </body>
</html>

命令:

xmlstarlet ed -O -P -u '//body/script' -v 'alert("success")' file.htm

输出:

<html>
<head>
     <script>....</script>
     <script>....</script>
  </head>
  <body>
    <script>alert("success")</script>
  </body>
</html>

http://xmlstar.sourceforge.net/doc/UG/xmlstarlet-ug.html

答案 1 :(得分:0)

最后在https://unix.stackexchange.com/questions/26284/how-can-i-use-sed-to-replace-a-multi-line-string

中得到了xara的答案

总之,不要尝试用sed做魔术,而是用一个sed理解的字符替换换行符(比如\r),做替换然后再用换行符替换字符。