Board logo

标题: 请教批处理修改文件内容问题【已解决】 [打印本页]

作者: w61655     时间: 2010-9-19 12:18    标题: 请教批处理修改文件内容问题【已解决】

文件a.ini原始结构:
<p1:Item>
    <p1:Key>CBP_514_SMDB</p1:Key>
    <p1:Type>Database</p1:Type>
    <p1:Database>
      <p1:Type>SMDB</p1:Type>
      <p1:SMDB>
        <p1:Host>10.71.110.175</p1:Host>
        <p1:Protocol>TELNET</p1:Protocol>
        <p1:Port>23</p1:Port>
        <p1:UID>smdb13</p1:UID>
        <p1:PWD>bGu7HJLDe7ib5QI0WJia2g==</p1:PWD>
        <p1:SysomcUID/>
        <p1:SysomcPWD>qmrOF5nY34i8yYrXmljISQ==</p1:SysomcPWD>
      </p1:SMDB>
    </p1:Database>
  </p1:Item>

目标结构:
<p1:Item>
    <p1:Key>CBP_514_SMDB</p1:Key>
    <p1:Type>Database</p1:Type>
    <p1:Database>
      <p1:Type>SMDB</p1:Type>
      <p1:SMDB>
        <p1:Host>10.71.110.175</p1:Host>
        <p1:Protocol>TELNET</p1:Protocol>
        <p1:Port>23</p1:Port>
        <p1:Protocol2>FTP</p1:Protocol2>
        <p1:Port2>21</p1:Port2>
        <p1:UID>smdb13</p1:UID>
        <p1:PWD>bGu7HJLDe7ib5QI0WJia2g==</p1:PWD>
        <p1:SysomcUID/>
        <p1:SysomcPWD>qmrOF5nY34i8yYrXmljISQ==</p1:SysomcPWD>
      </p1:SMDB>
    </p1:Database>
  </p1:Item>

即增加了如下两行:
<p1:Protocol2>FTP</p1:Protocol2>
<p1:Port2>21</p1:Port2>

增加的条件:
a.ini中有很多这样结构的item项,只有<p1:Type>为SMDB的项才增加。如果item本身中已经存在了这两行,也不需要增加

多谢

[ Last edited by w61655 on 2010-9-20 at 09:47 ]
作者: w61655     时间: 2010-9-20 09:45    标题: 已经解决

用gawk来做,
BEGIN{ftp_flag=0;smdb_flag=0}{

        if ($0 ~ "<p1:Item>")
        {
                print $0  

                getline line
                print line
               
                while (line !~ "</p1:Item>")
                {
                        getline line
                        print line   
                       
                        while (line ~ "<p1:Type>SMDB</p1:Type>")
                        {
                                getline line
                                print line   

                                while (line !~ "</p1:SMDB>")
                                {
                                        smdb_flag=1
                                                                               
                                        lines[row]=line
                                        getline line
                                        row++

                                        if (line ~ "<p1:Protocol2>FTP</p1:Protocol2>" || line ~ "<p1:Protocol2>SFTP</p1:Protocol2>")
                                        {
                                                ftp_flag=1
                                        }
                                }
                               
                                if(smdb_flag=1)
                                {
                                        for(i=1;i<row;i++)
                                        {
                                                print lines[i]  
                                                if(lines[i] ~ "<p1:Port>" && ftp_flag==0)
                                                {
                                                        print "<p1:Protocol2>FTP</p1:Protocol2>"  
                                                        print "<p1:Port2>21</p1:Port2>"                                               
                                                }
                                        }
                                        print line
                                       
                                        ftp_flag=0
                                        smdb_flag=0
                                        delete lines
                                        row=0
                                }
                        }
                }
                next
        }
        print $0
}