如何用Shell脚本提取前后均为空行的行?
提取前后均为空行的行
针对你的需求,以下是用awk和sed实现的两种方案:
awk 方案
awk ' { lines[NR%3] = $0 } NR >= 3 && lines[(NR-2)%3] == "" && lines[(NR-1)%3] != "" && lines[NR%3] == "" { print lines[(NR-1)%3] } ' your_file.txt
原理
- 用数组
lines循环存储最近的3行内容,通过NR%3实现循环覆盖,避免数组无限增长。 - 当处理到第3行及以后时,检查三个条件:
- 前前一行(
lines[(NR-2)%3])是空行 - 前一行(
lines[(NR-1)%3])是非空行 - 当前行(
lines[NR%3])是空行
- 前前一行(
- 满足条件时,打印中间的非空行,也就是前后都被空行包围的目标行。
sed 方案
sed -n ' /^$/{ n /^$/!{ h n /^$/{ x p } } } ' your_file.txt
原理
-n参数关闭sed默认的每行打印行为,只输出我们指定的内容。- 匹配到空行时:
- 用
n读取下一行,如果该行不是空行,就把它存入保持空间(h)。 - 再用
n读取下一行,如果该行是空行,就交换保持空间和模式空间(x),然后打印(p)。
- 用
- 这个逻辑精准匹配了「空行 → 非空行 → 空行」的模式,输出中间的非空行。
内容的提问来源于stack exchange,提问作者Dave Dolone
相关产品推荐
相关产品推荐

