09、sed 模式范围

前面的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岁,清华大学