1

昨天在看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

willww64
1 声望0 粉丝