如何根据tcl中的前一行提取某些字符串

时间:2015-05-07 13:08:44

标签: regex tcl

假设我有以下字符串:

m=audio 56000 RTP/AVP 0 8 18 205 150 101
o=India-SIPUA 2331 0 IN IP4 10.77.34.6
s=SIP Call
m=audio 22058 RTP/AVP 0 8 18 105 104 101
c=IN IP4 10.77.34.6

现在我需要根据搜索字符串“o = India-SIPUA 2331 0 IN IP4 10.77.34.6”搜索第二个“m = audio”

为此我得到以下代码来搜索字符串“o = India-SIPUA 2331 0 IN IP4 10.77.34.6”

set buffer "m=audio 56000 RTP/AVP 0 8 18 205 150 101
o=India-SIPUA 2331 0 IN IP4 10.77.34.6
s=SIP Call
m=audio 22058 RTP/AVP 0 8 18 105 104 101
c=IN IP4 10.77.34.6"
set patt "India-SIPUA"
set ipaddress "10.77.34.6"

foreach buf [split $buffer "\n"] {
  if {[regexp "o=$patt.*$ipaddress" $buf match]} {
     puts "+++++++Port==$match++++++"
     break
  } else {
     puts "\n Not found"
  }
}

现在应该写什么才能获得紧跟在字符串“o = India-SIPUA ...”之后的m =音频字符串

2 个答案:

答案 0 :(得分:1)

你可以像这样一次通过:

#!/usr/bin/tclsh
set buffer "m=audio 56000 RTP/AVP 0 8 18 205 150 101
o=India-SIPUA 2331 0 IN IP4 10.77.34.6
s=SIP Call
m=audio 22058 RTP/AVP 0 8 18 105 104 101
c=IN IP4 10.77.34.6"
set patt "India-SIPUA"
set ipaddress "10.77.34.6"

if {[regexp "(o=$patt.+$ipaddress)\n(?:.*\n)*(m=audio .*)\n.*" $buffer match match1 match2]} {
     puts "+++++++Port==$match1++++++"
     puts "+++++++Audio==$match2+++++"
}

正则表达式本身: (o=$patt.+$ipaddress)\n(?:.*\n)*(m=audio .*)\n.*

  • (o=$patt.+$ipaddress)\n()匹配的第一个捕获组o=...[your pattern],直到\n(未捕获)
  • (?:.*\n)*非捕获文字组,最后有换行符,*运算符与此组匹配无或多次
  • (m=audio .*)\n第二个捕获组()m=audio行匹配,直至\n(未捕获)
  • .*只是为了匹配缓冲区的其余部分,而不是捕获它。

对于regexp中的变量,首先是匹配,其他是捕获组的目的地。

如果缓冲区匹配,则使用前缀打印两个捕获的组。

输出:

 ./script.tcl
+++++++Port==o=India-SIPUA 2331 0 IN IP4 10.77.34.6++++++
+++++++Audio==m=audio 22058 RTP/AVP 0 8 18 105 104 101+++++

答案 1 :(得分:1)

使用标志知道您是否在then测试标志中找到了第一个模式,并将patt的内容更改为您需要匹配的正则表达式,更改标记和继续循环,或找到第二个模式,你就打破了循环。