假设以下代码段:
<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,但它不适合我的特定情况,因为它匹配搜索选项之间的所有内容。我需要匹配一些东西,然后在第一个搜索运算符之前添加一些东西。
答案 0 :(得分:1)
sed
,grep
,awk
等不适用于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>
答案 1 :(得分:0)
最后在https://unix.stackexchange.com/questions/26284/how-can-i-use-sed-to-replace-a-multi-line-string
中得到了xara的答案总之,不要尝试用sed做魔术,而是用一个sed理解的字符替换换行符(比如\r
),做替换然后再用换行符替换字符。