Mac下使用sed删除两模式间内容但保留模式的问题求助
Mac系统下保留标记删除中间内容的sed解决方案
针对你的需求——删除/* React App Start */和/* React App End */之间的所有代码,同时保留这两个标记本身,在Mac的BSD sed环境下可以使用以下命令:
sed -i '' -e '/\/\* React App Start \*\//{p; :a; N; /\/\* React App End \*\//!ba; s/.*\n/\n/}' views/layouts/index.html
命令说明
-i '':实现原地编辑文件,空参数表示不生成备份文件;如果需要备份原文件,可以改成-i.bak(执行后会生成index.html.bak备份)/\/\* React App Start \*\//{ ... }:仅对匹配到起始标记的行执行内部逻辑p:先输出起始标记行:a:定义循环标签aN:将下一行内容追加到当前模式空间(处理多行内容)/\/\* React App End \*\//!ba:如果模式空间内还没匹配到结束标记,就跳回标签a继续读取下一行s/.*\n/\n/:把模式空间中起始标记之后到结束标记之前的所有内容替换为空,只保留结束标记行
为什么之前的命令失效?
你之前尝试的{//!d;}命令仅能处理单行内容,当中间的JavaScript代码跨多行时,BSD sed的逐行处理逻辑无法覆盖所有中间行,导致部分内容残留。上述命令通过N和循环标签实现了多行匹配处理,能完整清除标记间的所有内容。
内容的提问来源于stack exchange,提问作者Rob H
相关产品推荐
相关产品推荐

