昨天在看sed 简明教程。自己实验两个地址都是正则时,遇到了一些问题,谷歌也找不到详细解释。经过多次实验,终于弄清楚了。下面说下我自己的理解。
sed 的地址可以是行号,也可以是正则表达式。当两个地址都是正则时,通过下面的循环确定地址范围:
假设表达式为:/re1/,/re2/
,则确定地址范围的过程为:
-
从第一行开始,寻找第一个匹配
re1
的行:若未找到匹配
re1
的行,则退出循环。即不再寻找匹配re2
的行,地址范围为空。-
找到第一个匹配
re1
的行n1
后,开始从n1
后寻找第一个匹配re2
的行。若未找到匹配
re2
的行,则地址范围为n1-$
,退出循环。若找到第一个匹配
re2
的行n2
,则得到第一部分地址范围n1-n2
。然后从 n2 后(不包括 n2 行)开始下一次循环,即从 n2 行后,寻找第一个匹配re1
的行。
示例:
$ cat sed_addr_re.txt
1
2
3
4
2
2
3
3
# 第一次循环, re1 未匹配
$ sed '/0/,/4/d' sed_addr_re.txt
1
2
3
4
2
2
3
3
# 第一次循环, re1 匹配,re2 未匹配。
$ sed '/2/,/5/d' sed_addr_re.txt
1
# 第一次循环,re1 匹配,re2 匹配。第二次循环 re1 未匹配。
$ sed '/1/,/4/d' sed_addr_re.txt
2
2
3
3
# 第一次循环,re1 匹配,re2 匹配。第二次循环 re1 匹配, re2 未匹配。
$ sed '/2/,/4/d' sed_addr_re.txt
1
# 第一次循环,re1 匹配,re2 匹配。第二次循环 re1 匹配, re2 匹配。
$ sed '/2/,/3/d' sed_addr_re.txt
1
4
3
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。