免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 9497 | 回复: 12
打印 上一主题 下一主题

sed 如何只读取第一次出现的字符 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-05-10 18:14 |只看该作者 |倒序浏览
file.txt内容如下
    xmldata=%3C%3Fxml+version%3D%221.0%22%3F%3E%0A%3CInterBOSS%3E%0A++%3COrigDomain%3EBOSS%3C%2FOrigDomain%3E%0A++%3CHomeDomain%3EPIMM%3C%2FHomeDomain%3E%0A++%3CBIPCode%3EBIP2B210%3C%2FBIPCode%3E%0A++%3CBIPVer%3E0100%3C%2FBIPVer%3E%0A++%3CActivityCode%3ET2101225%3C%2FActivityCode%3E%0A++%3CActionCode%3E0%3C%2FActionCode%3E%0A++%3CRouting%3E%0A++++%3CRouteType%3E00%3C%2FRouteType%3E%0A++++%3CRouteValue%3E000%3C%2FRouteValue%3E%0A++%3C%2FRouting%3E%0A++%3CProcID%3E2011030713560415483657%3C%2FProcID%3E%0A++%3CTransIDO%3E2011030713560476197191%3C%2FTransIDO%3E%0A++%3CTransIDH%3E%3C%2FTransIDH%3E%0A++%3CProcessTime%3E20110307135604%3C%2FProcessTime%3E%0A++%3CSPReserve%3E%0A++++%3CTransIDC%3E7310BOSS2011030713560476197191%3C%2FTransIDC%3E%0A++++%3CCutOffDay%3E20110307%3C%2FCutOffDay%3E%0A++++%3COSNDUNS%3E7310%3C%2FOSNDUNS%3E%0A++++%3CHSNDUNS%3E0000%3C%2FHSNDUNS%3E%0A++++%3CConvID%3EBOSS73105555201103071356047619719120110307135604829%3C%2FConvID%3E%0A++%3C%2FSPReserve%3E%0A++%3CTestFlag%3E0%3C%2FTestFlag%3E%0A++%3CMsgSender%3E0000%3C%2FMsgSender%3E%0A++%3CMsgReceiver%3E0005%3C%2FMsgReceiver%3E%0A++%3CSvcContVer%3E0100%3C%2FSvcContVer%3E%0A++%3CSvcCont%3E%3C%21%5BCDATA%5B%3C%3Fxml+version%3D%221.0%22+encoding%3D%22UTF-8%22%3F%3E%0A%3CUDR%3E%0A++++%3CCrtT%3E20110307135604%3C%2FCrtT%3E%0A++++%3CPkgSeq%3E197186%3C%2FPkgSeq%3E%0A++++%3CUDSum%3E2%3C%2FUDSum%3E%0A++++%3CUD%3E%0A++++++++%3CIDV%3E15873754652%3C%2FIDV%3E%0A++++++++%3COpr%3E07%3C%2FOpr%3E%0A++++++++%3CBizType%3E10%3C%2FBizType%3E%0A++++++++%3COprT%3E20110307135554%3C%2FOprT%3E%0A++++++++%3CEfftT%3E20110307135433%3C%2FEfftT%3E%0A++++++++%3CSrc%3E08%3C%2FSrc%3E%0A++++++++%3CChgFlg%3E0%3C%2FChgFlg%3E%0A++++++++%3CBillFlg%3E2%3C%2FBillFlg%3E%0A++++++++%3CBizOrder%3E%0A++++++++++++%3CSPID%3E698022%3C%2FSPID%3E%0A++++++++++++%3CSPBizCode%3E100000%3C%2FSPBizCode%3E%0A++++++++%3C%2FBizOrder%3E%0A++++%3C%2FUD%3E%0A++++%3CUD%3E%0A++++++++%3CIDV%3E18274561808%3C%2FIDV%3E%0A++++++++%3COpr%3E07%3C%2FOpr%3E%0A++++++++%3CBizType%3E10%3C%2FBizType%3E%0A++++++++%3COprT%3E20110307135558%3C%2FOprT%3E%0A++++++++%3CEfftT%3E20110307135558%3C%2FEfftT%3E%0A++++++++%3CSrc%3E08%3C%2FSrc%3E%0A++++++++%3CChgFlg%3E0%3C%2FChgFlg%3E%0A++++++++%3CBillFlg%3E2%3C%2FBillFlg%3E%0A++++++++%3CBizOrder%3E%0A++++++++++++%3CSPID%3E698022%3C%2FSPID%3E%0A++++++++++++%3CSPBizCode%3E100000%3C%2FSPBizCode%3E%0A++++++++%3C%2FBizOrder%3E%0A++++%3C%2FUD%3E%0A%3C%2FUDR%3E%5D%5D%3E%3C%2FSvcCont%3E%0A%3C%2FInterBOSS%3E


grep "IDV" file.txt | sed -e 's/.*CIDV//'|sed -e 's/IDV.*//'|awk -F'%' '{print $2}'|sed 's/.*E//'
     
结果:
18274561808
我想要的是第一次出现"IDV"标签中号码15873754652而不是最后一次出现"IDV"标签内的号码怎么写呢?

论坛徽章:
0
2 [报告]
发表于 2011-05-10 18:43 |只看该作者
本帖最后由 xiaopan3322 于 2011-05-10 19:25 编辑

前提:15873754652两边的字段是固定的……
try:
  1. awk -F'%3CIDV%3E|%3C%2FIDV' '{print $2}' urfile
复制代码
or
  1. sed 's/CIDV%3E/\n/g;s/%3C%2FIDV/\n/g' urfile | grep -Ewo "[0-9]{10,}" | head -n1
复制代码

论坛徽章:
0
3 [报告]
发表于 2011-05-10 18:55 |只看该作者
回复 1# situxiaoquan1


    笨点的方法:
|sed 's/.*\(3CIDV%3E15873754652%3C%2FIDV%3E%\).*/\1/g'|sed 's/.*\(15873754652\).*/\1/g'

论坛徽章:
0
4 [报告]
发表于 2011-05-10 19:16 |只看该作者
回复 3# db2-zhang

    感觉你很搞笑……
    不会有人像你这么解题的,如果连“15873754652”都知道的话,还需要这么麻烦,直接grep -o '15873754652' 不就行了

论坛徽章:
0
5 [报告]
发表于 2011-05-10 21:22 |只看该作者
awk/sed 是有q这项命令的,可以让命令提前退出,那么就是只打印了第一次出现时候的值。

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
6 [报告]
发表于 2011-05-10 23:31 |只看该作者
回复 1# situxiaoquan1
  1. awk -vRS="IDV%" 'NR==2{print gensub(/..([0-9]+).*/,"\\1",1,$1)}'
复制代码

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
7 [报告]
发表于 2011-05-11 10:10 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
8 [报告]
发表于 2011-05-11 10:32 |只看该作者
本帖最后由 gao_linfeng 于 2011-05-11 10:37 编辑

sed -n 's/.*3CIDV%3E\([0-9]\{2,\}\).*$/\1/p' file.txt|head -n 1

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
9 [报告]
发表于 2011-05-11 10:48 |只看该作者
可以利用 \n 先做一个锚定,然后再处理。
  1. sed 'G;s/\(IDV\)\(.*\)\(\n\)/\1\3\2/;s/.*\n%[^%]*E\([0-9][0-9]*\).*/\1/' urfile
复制代码

论坛徽章:
0
10 [报告]
发表于 2011-05-11 14:39 |只看该作者
本帖最后由 zzy7186 于 2011-05-11 14:44 编辑

  1. perl -ne '{$_=~s/FIDV/\n/g;$_=~s/^.*CIDV.*([0-9]{11}).*/$1/mg;$_=~s/\n.*//g;print $_,"\n"}' urlfile
  2. 15873754652
复制代码
不知道perl中有没有像sed 中P打印第一行的功能
这样就可以省了$_=~s/\n.*//g
sed中:
s/FIDV/\n/g
替换后
模式空间里应该有几行
但s/^.*CIDV.*([0-9]{11}).*/$1/g 不能针对每一行没有perl中m的功能??
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP