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