sed匹配一行中两个单词之间的内容

2011年12月22日 发表评论 阅读评论

有下面的一行内容,我想要取出idc:www.networkbench.com1324519136406这一部分

var result={"citys":[{"TS_CONNECT":0.045,"TM_BASE":"2013-01-04 15:26:08","BYTE_TOTAL":67463,"TS_PACKAGE":0.044,"TS_TOTAL":3.111,"CLIENT_ISP":"中国网通","TS_PAGE_BASE":1.465,"RATE_DOWNLOAD":22.722,"CLIENT_CITYNAME":"北京市","CLIENT_IP":"222.128.197.9","TS_DNS":1.037,"RATE_DOWNLOAD_PAGE_BASE":10.114,"TS_FIRST":2.699,"TS_CONTENTS":1.749,"DEST_IPver=20110329","TS_ELEMENT":0.75,"BYTE_TOTAL":6416,"HTTP_STAT_CODE":200,"URL_IP":"XXX.XX.XXX.XXX","ERROR_CODE":0,"ELEMENT_TYPE":"application/x-javascript"}],"DEST_ISP":"361way","DEST_CITYNAME":"杭州市"}],"TASK_URL":"361way.com","TS_AVG":3.111,"TASK_TYPE":1,"TASK_NAME":"idc:www.networkbench.com1357284366955","TASK_TRACERT":false,"TASK_NSLOOKUP":false};

可以通过以下语句实现:

sed 's/.*"TASK_NAME":"(.*)","TASK_TRACERT".*/1/g' a.txt

因为上面的内容是一整行,用正则表达式之前一直匹配出错,都是匹配出同一行。后来想到php中的preg_match函数,发现用该函数能完美的实现两个单词之间的提取。不过细一想,PHP和sed之间的正则表达应该是相通的。于是就依葫芦画瓢照搬过来。果然在sed里发现也能实用。

其实该处的用法是sed 's///g'的变形,更改为sed 's/.*匹配字符串(.*).*匹配字符串/1/g',其中.*代表匹配所有字符串(.*)和后面的1代表的是同一部分。意为找两个字符串之间的匹配部分。具体可以参看http://www.ibm.com/developerworks/cn/linux/shell/sed/sed-2/里的那些极好的带反斜杠的圆括号部分。有时为了便于对一次性完成多处文本的操作,可以定义几处(.*)区域,这时就要在后面通过1,2,3……来选择所要显示或修改的区域。

而关于正则表达式的详细介绍可以参看百度百科和维基百科中详细介绍:

http://baike.baidu.com/view/94238.htm

http://zh.wikipedia.org/wiki/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F




本站的发展离不开您的资助,金额随意,欢迎来赏!

You can donate through PayPal.
My paypal id: itybku@139.com
Paypal page: https://www.paypal.me/361way

分类: perl/php/python/gawk/sed 标签:
  1. 2015年5月8日21:26 | #1

    按照你的方法为什么我提取的是一行的内容呢??

    • admin
      2015年5月10日21:11 | #2

      请将你的源文件和使用的指令提供下?