如何让sed仅对第一个匹配的文本范围生效?
解决方案:仅删除sed匹配范围内的第一块文本
当前使用的sed命令:
sed -i "/^### Header$/,/^### [^#]*$/{//!d}"
该命令会删除所有以### Header开头,到下一个三级标题之间的非标题文本。但需求是仅删除第一个匹配范围内的文本,且无法预知下一个标题的具体名称。
输入内容
### Header blabla ### Header 2 some text ### Header blabla ### Header 2 some text ### Header blabla ### Header 2 some text
期望输出
### Header ### Header 2 some text ### Header blabla ### Header 2 some text ### Header blabla ### Header 2 some text
可行命令
使用带范围限定的sed命令,仅对第一个匹配块生效:
sed -i '0,/^### Header$/{/^### Header$/,/^### [^#]*$/{//!d}}'
命令解释
0,/^### Header$/:把操作范围限制在文件开头到第一个### Header行内,确保后续逻辑只作用于第一个目标块- 嵌套的
/^### Header$/,/^### [^#]*$/{//!d}:在上述范围内,删除### Header到下一个三级标题之间的所有非标题行 - 外层范围的限定让后续同名标题块不会被处理,完全符合需求
内容的提问来源于stack exchange,提问作者aviram_Piletzki
相关产品推荐
相关产品推荐

