如何用sed按标题删除Markdown文件中的指定段落?
用sed删除Markdown指定标题及其段落
原始文件(markdown.md)
# Title1 line 1 line 2 line 3 # Title2 line 1 line 2 line 3
期望输出
# Title2 line 1 line 2 line 3
尝试的错误命令及报错
尝试的命令:
cat markdown.md | sed '/^# Title1.*/,+1d {/^\s*$/d}'
报错信息:
sed: 1: "/^# Title1.*/,+1d { ...": extra characters at the end of d command
正确解决方案
命令1:
sed '/^# Title1$/{:a;N;/^\n$/!ba;d}' markdown.md
命令2(-n模式更直观):
sed -n '/^# Title1$/{:loop; n; /^[[:space:]]*$/!b loop; d;}; p' markdown.md
命令解释
核心思路是匹配目标标题后,持续读取后续行直到遇到空行,再删除这段范围内的所有内容:
- 以命令1为例:
/^# Title1$/:精准匹配目标标题行{:a;N;/^\n$/!ba;d}:执行多行处理逻辑:a:定义循环标记aN:将下一行内容追加到当前模式空间(合并多行)/^\n$/!ba:如果模式空间结尾不是空行(还没到段落分隔的空行),跳回标记a继续读行d:删除整个模式空间内的内容(从标题行到空行前的所有行)
- 命令2用
-n关闭默认输出,仅打印未被处理的行:匹配标题后循环读行,直到空行就删除这段内容,其余行正常打印。
错误原因
你之前的命令存在语法错误:sed中d(删除)是独立命令,不能在d后直接跟{}命令组。必须将多行处理逻辑放在地址匹配后的命令块中,通过循环实现“读取直到空行”的需求。
内容的提问来源于stack exchange,提问作者Spanner0jjm
相关产品推荐
相关产品推荐

