- 论坛徽章:
- 0
|
请教多行匹配问题
- # cat ./1
- #!/bin/awk -f
- {
- if (match($0,/<table>|<\/table>/)) { #这里表示匹配<table>或</table>
- if (substr($0,RSTART+1,1)=="t") {
- # 当上句 match 匹配成功会自动设置变量 RSTART, 含义为匹配字符串第一个字符在整行中的位置.
- # 因此, substr($0,RSTART+1,1) 是取匹配字符串 <table> 或 </table>
- # 的第二个字符. 如果是 t, 当然说明匹配的是 <table> 了
- i++ # 由于匹配了 <table> , 表嵌套深度加 1
- if (n==0 )
- n=NR # 纪录一个表结构最外层开始的行号
- }
- else
- i-- # 匹配了 </table> , 表嵌套深度减 1
- m=NR - n - 1 #中间的行数, 这句实际应放在下面 if(m=... 语句之前
- if (i==0 && n != 0) { # 嵌套深度为0,但table开始的行号不为0, 说明刚刚完成一个表结构的扫描.
- # 当然, 如果 i==0 && n==0 则说明没有遇到表结构
- if (m==3 || m==7) { #当表包含行数为3或7时候, 符合删除条件
- # s 是传给 END 中 sed 的删除语句, 如 s="2,6d;8,16d"
- if (s=="") # 遇到第一个表时赋值,如 s="2,6d"
- s=n","NR"d"
- else
- s=s";"n","NR"d" # 后面的表,需加";" , 如 s=s";8,16d"
- }
- n=0 # 处理完一个表结构后, 表开始行数复零
- }
- }
- }
- END {
- if (i != 0) { # 文件中的 <table> 和 </table> 总数不等,因此语法错误.
- print "Format Error !!"
- exit
- }
- if ( s != "" )
- system("sed \""s"\" "ARGV[1]) # 调用 sed 删除相应的行
- else
- print "No matches found !!"
- }
复制代码
由于 html 是一种自由格式, 因此每一行可能有多个 <table> </table>
那样的话, 此程序就不灵了. 你可以自己写一个这种情况的,比较繁琐, 相信
你的 awk 水平一定会有个大的提高.
此外, 如果 <table> </table> 出现在 <!-- --> 中则失去 tag 含义.
总之, 要想符合各种条件, 几乎是不可能的. |
|