昨天在看sed 简明教程。本身实验两个地址都是正则时,遇到了一些问题,谷歌也找不到详细解释。通过屡次实验,终于弄清楚了。下面说下我本身的理解。html
sed 的地址能够是行号,也能够是正则表达式。当两个地址都是正则时,经过下面的循环肯定地址范围:正则表达式
假设表达式为:/re1/,/re2/
,则肯定地址范围的过程为:shell
从第一行开始,寻找第一个匹配 re1
的行:bash
若未找到匹配 re1
的行,则退出循环。即再也不寻找匹配 re2
的行,地址范围为空。code
找到第一个匹配 re1
的行 n1
后,开始从 n1
后寻找第一个匹配 re2
的行。htm
若未找到匹配 re2
的行,则地址范围为 n1-$
,退出循环。教程
若找到第一个匹配 re2
的行 n2
,则获得第一部分地址范围 n1-n2
。而后从 n2 后(不包括 n2 行)开始下一次循环,即从 n2 行后,寻找第一个匹配 re1
的行。get
示例:class
$ 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