如何批量删除文件中以## Table开头至空行的文本块?
批量删除文件中以
## Table开头至首个空行的内容 需求说明
需要对数百个文件执行操作:删除所有以## Table开头的行,以及该行之后直到第一个空行的所有内容,待删除内容的行数不固定。
失败的尝试
最初使用的sed命令无法满足需求:
sed -e '/^\s*[*#]/d'
该命令会删除所有以空白字符开头且后跟*或#的行,误删了不需要处理的内容(比如示例中的## Prerequisites),不符合预期。
可行解决方案
以下两个命令均可实现需求:
1. 使用sed命令
sed -i '' '/## Table/,/^$/d' 文件名
- 逻辑:匹配从包含
## Table的行开始,到第一个空行(^$)结束的区间,删除该区间内的所有内容。 - 注意:macOS环境下
sed的-i参数需要加空字符串作为后缀(避免生成备份文件);Linux环境可直接使用sed -i '/## Table/,/^$/d' 文件名。
2. 使用awk命令
awk '/^## Table/ {skip=1} NF==0 {skip=0} !skip' 文件名 > 新文件名
- 逻辑:
- 当匹配到以
## Table开头的行时,设置标记skip=1(后续行跳过输出); - 当遇到空行(
NF==0表示该行无字段)时,设置skip=0(恢复输出); - 最后只输出未被标记为跳过的行(
!skip)。
- 当匹配到以
- 若要直接修改原文件,可结合临时文件实现:
awk '/^## Table/ {skip=1} NF==0 {skip=0} !skip' 文件名 > tmp && mv tmp 文件名
示例验证
原文件text.txt内容:
Random text. ## Table of Contents * [Design System](#<b>Design-System</b>) * [Multisite Designs](#Multisite) * [Recommended Changes Per Site](#mcetoc_123) * [Recommended Consistent Elements Across Sites](#mcetoc_456) * [Templates v. Pages](#Templates-v-Pages) * [Layouts](#mcetoc_dfghj) * [Features](#Features) * [Something](#mcetoc_khjvfsdfsd) * [Feature](#mcetoc_dfwyduegwu) * [See More Logic](#mcetoc_fdsfsdugfs) * [Advertising, and Print](#Advertising-and-Print) * [Images](#Images) * [Featured Image)](#mcetoc_fghjk) * [Videos](#Videos) * [Video Art](#mcetoc_4567890) * [Author and Search Pages](#Author-Tag-and-Search-Pages) * [Accessibility](#Accessibility) Then here is some text. Here is more text! ## Prerequisites
执行命令后期望结果:
Random text. Then here is some text. Here is more text! ## Prerequisites
内容的提问来源于stack exchange,提问作者khaos119
相关产品推荐
相关产品推荐

