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 
}