linux下批量修改xml文件内容

coderone 2009-09-24 05:14:28
大家好:

好久不上CSDN了,上来就问问题,实在不好意思。但也不得不问。
我的问题是: 在linux下有多个xml文件,里面有相同的登录信息(如:连接数据库IP 用户名等),修改起来非常的不方便。我想将那些通用的信息再写一个ini文件,然后用脚本调用。不知如何实现。请大家指定下:

举例 :
xml文件中
<IP>0.0.0.0</IP>

ini文件
IP=1.1.1.1

现在要读取ini文件中字段,来修改xml字段。


请大家说下使用什么脚本,具体用的什么,谢谢。
...全文
1523 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
LJ_sdn 2012-03-11
  • 打赏
  • 举报
回复
我这边是可以打开却修改不了..
steptodream 2009-09-25
  • 打赏
  • 举报
回复
楼上的很详细啊 楼主问题解决了吧
pottichu 2009-09-25
  • 打赏
  • 举报
回复
这个脚本可以写得更通用写。


[root@martin tmp]# cat ini
IP=1.1.1.1
PORT=5000
NAME=HELLO
[root@martin tmp]# cat xml
<IP>1.1.0.0</IP>
<PORT>0</PORT>
<NAME>0</NAME>


[root@martin tmp]# cat t.sh
#!/bin/sh

modify_list=$(awk -F= '{print $1}' ini)
echo $modify_list

for tmp in $modify_list
do
value=$(cat ini | grep $tmp | awk -F= '{print $2}')
sed -i "s/\(<$tmp>\).*\(<\/$tmp>\)/\1$value\2/" xml
echo "change $tmp to $value"
done


piedgogo 2009-09-25
  • 打赏
  • 举报
回复
据说sed和awk都可以很容易实现
csan 2009-09-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 pottichu 的回复:]
Perl code

[root@martin tmp]# cat iniIP=1.1.1.1
PORT=5000
[root@martin tmp]# cat xml<IP>1.1.1.1</IP><PORT>5000</PORT>
[root@martin tmp]# cat t.sh../ini
sed-i"s/\(<IP>\).*\(<\/IP>\)/\1$IP\2/" xml
sed-i¡­
[/Quote]

学习了!
pottichu 2009-09-25
  • 打赏
  • 举报
回复


[root@martin tmp]# cat ini
IP=1.1.1.1
PORT=5000
[root@martin tmp]# cat xml
<IP>1.1.1.1</IP>
<PORT>5000</PORT>
[root@martin tmp]# cat t.sh

. ./ini
sed -i "s/\(<IP>\).*\(<\/IP>\)/\1$IP\2/" xml
sed -i "s/\(<PORT>\).*\(<\/PORT>\)/\1$PORT\2/" xml


csan 2009-09-25
  • 打赏
  • 举报
回复
没用过,3楼的方法ms可以尝试一下

顶!
fox000002 2009-09-25
  • 打赏
  • 举报
回复
可以用正则表达式来作替换

sed 或 awk
sun007700 2009-09-25
  • 打赏
  • 举报
回复
TiXml使用详解
http://blog.csdn.net/appletreesujie/archive/2009/05/21/4207435.aspx

很简单的,你读到ini文件中的"ip"等字段后,保存在一个vector里,然后再通过上边的网站介绍的方法读取
xml里的数据,把vector里的数据替换掉就可以了,即:
get,然后再set。
shihuaxian123 2009-09-25
  • 打赏
  • 举报
回复
js脚本解析xml就比较好
帅得不敢出门 2009-09-25
  • 打赏
  • 举报
回复
xml不是有现成的解析器么
也很方便的
pottichu 2009-09-25
  • 打赏
  • 举报
回复
搂住客气了,我也是闲着无事才在论坛上晃悠。

linux 和 unix 虽然都 遵循 POSIX 标准,但毕竟是两个不同的系统。
另外 sed 也有很多中版本。

其实这个脚本可以写的更灵活一点, 文件名字都可以用变量代替。
这些脚本我都在本机上实验过,没问题的。
coderone 2009-09-25
  • 打赏
  • 举报
回复
我郁闷了,是unix系统 AIX Version 5.3
刚刚去看了另外的一台机器是Rad hat linux系统 里面有 -i 选项。没有试验,应该可以执行。


这样就又有问题了,他们的sed 命令不一样吗?可不可以写个相对不变的脚本可以在这两个系统中都可以使用啊。

辛苦 pottichu

hanb99 2009-09-25
  • 打赏
  • 举报
回复
学习中。。。。。。。。。
pottichu 2009-09-25
  • 打赏
  • 举报
回复
你的linux 是什么版本的 ?
coderone 2009-09-25
  • 打赏
  • 举报
回复
没有还是没有更新过来,

我在网上查很少有 -i的描述啊,

只是找到这么一条:
s e d选项如下:
-n 不打印;s e d不写编辑行到标准输出,缺省为打印所有行(编辑和未编辑)。p命令可以用来打印编辑行。
-f 如果正在调用s e d脚本文件,使用此选项。此选项通知s e d一个脚本文件支持所有的s e d命令,例如:sed -f myscript.sed input_file,这里m y s c r i p t . s e d即为支持s e d命令的文件。
-c 下一命令是编辑命令。使用多项编辑时加入此选项。如果只用到一条s e d命令,此选项无用,但指定它也没有关系。
-i 编辑原文件(此选项慎用,如果使用则原文件就会被修改,无法恢复)。

不知为啥我的系统里没有-i -f -c 等选项
pottichu 2009-09-25
  • 打赏
  • 举报
回复
用这个脚本:

modify_list=$(awk -F= '{print $1}' ini)
echo $modify_list
for tmp in $modify_list
do
value=$(cat ini | grep $tmp | awk -F= '{print $2}')
newxml=$(cat xml | sed -e "s/\( <$tmp>\).*\( <\/$tmp>\)/\1$value\2/" )
echo $newxml > xml
echo "change $tmp to $value"
done

直接改成 -e 是不行的, -e 不能写文件。
iisbsd 2009-09-25
  • 打赏
  • 举报
回复
问题是,通常情况换行应该被替换成为一个空格,你把所有换行都去掉了,不就乱了么?

再说,换行都去掉了,人就没办法读了。
coderone 2009-09-25
  • 打赏
  • 举报
回复
恩,我将-i,修改成 -e 执行打印如下:
<IP>1.1.1.1</IP>
<PORT>0</PORT>
change IP to 1.1.1.1
<IP>0.0.0.0</IP>
<PORT>5000</PORT>
change PORT to 5000

可是并没有成功修改xml文件。

另外,我的系统里只有这两个选项。
Syntax

sed [ -n ] Script [ File ... ]

sed [ -n ] [ -e Script ] ... [ -f ScriptFile ] ... [ File ... ]
pottichu 2009-09-25
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 iisbsd 的回复:]
引用 15 楼 pottichu 的回复:
现删除掉换行,不是一样能处理。


不太合理,你怎么知道哪些换行可以替换掉,那些不行?
[/Quote]
老兄,你这不是抬杠么?
xml 协议,以标签对来标识数据段, 换行符可有可无,有的话更直观好看而已。
写程序 做 xml 解析也一样要考虑这些问题。

加载更多回复(7)

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧