sed 模式范围
前面的 sed 模式缓冲区 章节我们学习了 sed 如何处理 行范围。
除了可以从行号来选择所需要的行外,sed 还支持模式范围查找指定的行。
模式范围 可以是一个普通的文本,或者一个正则表达式。选择哪一个,看你的个人需求。
模式范围 的语法和 sed 模式缓冲区 中的语法类型,不同的只是把行号换成了 模式 而已。
例如要输出匹配指定模式的行,语法格式如下
/pattern/ p
使用我们之前的 data.txt
文件,内容如下
1) 小明,23岁,北京大学 2) 小红,22岁,清华大学 3) 小李,25岁,斯坦福大学 4) 小王,22岁,清华大学
如果要输出包含 小红
的行,模式语句为
/小红/ p
范例
输出包含 小红
的行
[www.twle.cn]$ sed -n '/小红/ p' data.txt
输出结果如下
2) 小红,22岁,清华大学
从匹配的行开始到指定行
sed 支持将模式范围和行范围结合起来,比如从匹配的模式行开始到指定的行号 n 之间的所有行(同时包含两者)。
这种组合模式,其实就是把 行范围 [n,m]
中的 n
替换为模式而已。
语法格式如下
/pattern/, n
表示从匹配模式 /pattern/
的行开始,到行 n
结束之间的所有行。
例如下面的命令表示从包含 小红 开始到第 4 行
/小红/, 4
范例
输出从包含 小红 开始到第 4 行之间的所有行
[www.twle.cn]$ sed -n '/小红/, 4 p' data.txt
输出结果如下
2) 小红,22岁,清华大学 3) 小李,25岁,斯坦福大学 4) 小王,22岁,清华大学
从匹配模式的行开始到文件结束的所有行
sed 的模式范围还支持 从匹配模式的行开始到文件结束的所有行,语法就是我们之前提到的 美元符号 ($
)。
从匹配模式的行开始到文件结束的所有行的语法格式如下
/pattern/, $
例如要输出从包含 小红 的行开始到文件结束的所有行,命令如下
/小红/, $ p
范例
输出从包含 小红 的行开始到文件结束的所有行
[www.twle.cn]$ sed -n '/小红/, $ p' data.txt
输出结果如下
2) 小红,22岁,清华大学 3) 小李,25岁,斯坦福大学 4) 小王,22岁,清华大学
模式范围区间
sed 还支持模式范围区间,也就是第一个模式用于指定开始,第二个模式用于指定结束。同时包含第一个模式匹配的行和第二个模式结束的行。
如果第二个模式没有找到,则会包含一直到文件结束。
两个模式之间使用 逗号 ( ,
) 分隔。
语法格式如下
/pattern/, /pattern2/ [, /patternN/]
例如,要输出包含 小红 和 小王 之间的所有行,命令如下
/小红/, /小明/
范例
输出包含 小红 和 小王 之间的所有行
[www.twle.cn]$ sed -n '/小红/, /小王/ p' data.txt
输出结果如下
2) 小红,22岁,清华大学 3) 小李,25岁,斯坦福大学 4) 小王,22岁,清华大学
模式范围 ( + 号语法 )
在前面的 sed 模式缓冲区 中我们提到 +
号用于表示连续的行。+n
用于表示连续的 n
行。
加号 +
同样能够用于模式范围,用于表示 从匹配行还是接下来的连续 n+1 行。
语法格式如下
/pattern/, +n p
例如要输出从包含 小红
开始接下来的 4+1 行,则命令如下
/小红/, +4
注意
- 如果 m 为
0
那么只会输出第 n 行。 - 如果 m 大于 0 那么会输出 [n,m+n] 行。
- 如果 n+m 的值大于总行数,那么会输出到文件末结束。
n,+m p
语法不适用于苹果电脑自带的sed
程序。会报错误sed: 1: "/小红/, +4 p": expected context address
范例
输出从包含 小红
的行开始的连续 4+1 行
[www.twle.cn]$ sed -n '/小红/, +4 p' data.txt
输出结果如下
2) 小红,22岁,清华大学 3) 小李,25岁,斯坦福大学 4) 小王,22岁,清华大学