如何编写Sed表达式匹配多行代码,在指定</script>前添加内容?
没问题,我来帮你写一个精准的Sed表达式,专门处理这种在<body>内最后一个带多个闭合大括号的</script>标签前插入内容的需求!
核心思路
我们需要锁定两个关键条件来避免误操作:
- 只在
<body>标签内部处理,绝对不碰<head>里的脚本 - 精准匹配到末尾是多个
}}}}(允许}之间有空白字符)的那个</script>标签
针对单行场景的Sed命令(你的示例场景)
如果你的}}}}和</script>在同一行(就像你给出的代码片段那样),直接用这个命令就够了:
sed '/<body>/,/<\/body>/{ /^\s*}\s*}\s*}\s*}\s*<\/script>$/s//要插入的内容\n&/ }' 你的输入文件.html
命令细节拆解:
/<body>/,/<\/body>/:划定操作范围,只处理<body>到</body>之间的行,彻底避免误改<head>里的脚本/^\s*}\s*}\s*}\s*}\s*<\/script>$/:匹配以任意空白(空格/制表符)开头,跟着四个}(每个}前后都可以有空白),最后以</script>结尾的行s//要插入的内容\n&/:把匹配到的行替换成「你要插入的内容」+ 换行 + 原来的整行内容(&代表匹配到的完整字符串)
针对多行场景的补充(如果}}}}和</script>分多行)
如果四个}分别在单独的行,最后一行才是</script>,可以用这个支持多行匹配的Sed命令:
sed '/<body>/,/<\/body>/{ /^\s*}\s*$/{ N; /^\s*}\s*\n\s*}\s*$/{ N; /^\s*}\s*\n\s*}\s*\n\s*}\s*$/{ N; /^\s*}\s*\n\s*}\s*\n\s*}\s*\n\s*<\/script>$/s//要插入的内容\n&/ } } } }' 你的输入文件.html
这个命令会逐步合并相邻行,直到匹配到四个单独的}行 + 最后一行的</script>,再插入你需要的内容。
内容的提问来源于stack exchange,提问作者user4093955
相关产品推荐
相关产品推荐

