Unix:使用sed替换多行字符串

时间:2014-03-11 13:34:42

标签: regex sed

我有一个这样的文本文件:

**I**(0,80041,11.03.2014-15:05:05:702+3600,32.IROUTED,317435,iptdm.dtag,0,153452069,241769,80041,1,#00000000000000000000000000000000){
A(**11.03.2014-15:04:59:492+3600**){a=**S9**,0102,,,,,,,,,,,{0,,;},,,,**1.2.3.4:5060**,,,,,,,,,;c=0,17;n=S9;p=255;s=sip;b=;e=0;x=,+498003301000,5.6.7.8,5060,,,,08003301000,sip.test.de,,,tag\=00E0F510024703F9633D883C7650,,+492214711,sip.test.de,,,tag\=as0cd2768d,,+492214711,9.8.7.6,5060,,,,+492214711,sip.test.de,,,,,,,,,,,,,,,,,,,,,,,,1.2.3.4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;mlpp=;o=,,,0,15,0;}
C(**11.03.2014-15:05:02:237+3600**){a=S9,0102,,,,,,,D001,,,,{0,,;},,,,,,LNP_FILLED,RAD_OK,iiap492214711,,**iiai492214711**,,**ii498003301000**,;c=0,17;d=3465;n=S9;p=255;s=sip;x=,+498003301000,5.6.7.8,5060,,,,08003301000,sip.test.de,,,tag\=00E0F510024703F9633D883C7650,,+492214711,sip.test.de,,,tag\=as0cd2768d,,+492214711,9.8.7.6,5060,,,,+492214711,sip.test.de,,,,,,,,,,,,,,,,,,,,,,,,1.2.3.4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;mlpp=;o=11,D001,,2,15,0;}
V(11.03.2014-15:05:05:702+3600){i=498003301000;k=teles;l=21f6f14f-a926-11e3-ad91-00e0f5100247,21f6f14f-a926-11e3-ad91-00e0f5100247,;m=toner,voip;q=9.8.7.6,g711alaw;qc=1,,0,g711alaw:g711ulaw:g723r63:g723ar63:g729r8:g729ar8:g729br8:g729abr8:clearmode,echo,auto,30,7,32,27,32,0,0,0,20,4294967295,rfc2833,96,red,force,both,,,,;qi=3,1.2.3.4,5060,9.8.7.6,5060,g711alaw;qs=2,132,172,21120,27520,4294967295,0,4294967295,0,0;tud=,D001,,,,;ivr=,;h323=,,,,0:0:0;sip=4b211f615c1edd2e19ee10296df8a177@sip.test.de;}
D(**11.03.2014-15:05:05:702+3600**){f=A,CAU_NCC,LOC_PUBL_NTWK_SERV_REM_USER,CAU_NCC,LOC_PUBL_NTWK_SERV_REM_USER;t=S,CAU_NCC,LOC_PUBL_NTWK_SERV_REM_USER,CAU_NCC,LOC_PUBL_NTWK_SERV_REM_USER;a=S9,0102,,,,,,,D001,,,,{0,,;},,,,,,LNP_FILLED,RAD_OK,iiap492214711,,iiai492214711,,ii498003301000,;x=,+498003301000,5.6.7.8,5060,,,,08003301000,sip.test.de,,,tag\=00E0F510024703F9633D883C7650,,+492214711,sip.test.de,,,tag\=as0cd2768d,,+492214711,9.8.7.6,5060,,,,+492214711,sip.test.de,,,,,,,,,,,,,,,,,,,,,,,,1.2.3.4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;o=11,D001,,2,15,0;}
E(11.03.2014-15:05:05:702+3600){g=;}
}

我想要将每条腿的一些字段放入gred并将它们放入带有sed或awk的csv文件中:

I,11.03.2014-15:04:59:492+3600,S9,1.2.3.4:5060,11.03.2014-15:04:59:492+3600,iiai492214711,ii498003301000,11.03.2014-15:05:05:702+3600

我的尝试:

sed 's/\([IO]\)(.*){
A(\(.*\)){a=\(.*\),.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,{.*,.*,.*;},.*,.*,.*,\(.*\),.*}
.*
C(\(.*\)){a=.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,{.*,.*,.*;},.*,.*,.*,.*,.*,.*,.*,.*,.*,\(.*\),.*,\(.*\),.*}
D(\(.*\)){.*}
.*
}/\1,\2,\3,\4,\5,\6,\7,\8' file

如何使用sed将此正则表达式字符串用于多行?

1 个答案:

答案 0 :(得分:1)

尝试这样的事情

sed -n '/[*][*]I.*{/,/^}/ {
   /^[*][*]I/ {s/^[^,]*,\([^,]*\),.*/I,\1/;h;}
   /^A/   {s/^[^=]=[*][*]\([^*]*\)[*][*]\.*[*][*]\([^*]*\)[*][*].*/\1,\2/;H;}
   /^B/   {#extract what you want on this line }
   ...
   /^}/ {g;s/\n/,/p;}
   }' YourFile

您在行的每个部分( I 组)中提取所需信息,与,分开,将其添加到保留缓冲区,最后调用缓冲区(每一行)并用,替换新行,然后将结果放入