请教shell读写XML问题
请教shell读写XML问题
现有 123.xml文件,内容是:
<?xml version="1.0" encoding="GBK"?>
<videoinfo>
<videoname>呵呵</videoname>
<videopath>20080110</videopath>
<videosize>0.0</videosize>
<widthOfImage>320</widthOfImage>
<heightOfImage>240</heightOfImage>
<kbps>260</kbps>
<logo>260</logo>
<videodesc>呵呵恶化和</videodesc>
<state>1</state>
<uploadtime>Thu Jan 10 16:00:53 CST 2008</uploadtime>
</videoinfo>
我想用shell 脚本编写一个程序,修改里面的内容。比如修改<state>1</state>为<state>2</state> ,
修改<videosize>0.0</videosize>为<videosize>333</videosize> 该怎么操作呢。谢谢各位高手。
davistar 发表于 2008-01-10 17:47
eg
[code]
awk '{if(/state/){sub(/>[^<]*</,">2<")}print}' urfile
sed 's//(<state>/)[^<]*/(<//state>/)//12/2/' urfile
[/code]
hyhappy 发表于 2008-01-10 17:53
楼上的好厉害,只是看的不太明白 。能大概给解释一下吗?
awk '{if(/state/){sub(/>[^<]*</,">2<")}print}' urfile
sed 's//(<state>/)[^<]*/(<//state>/)//12/2/' urfile 这两行是都可以实现上述操作吗?我第一个测试可以,第2个测试没成功。
linuxnextyear 发表于 2008-01-10 18:16
[quote]awk '{if(/state/){sub(/>[^<]*</,">2<")}print}' urfile
[/quote]
我也刚弄完xml的,帮你解释一下这个:
if(/state/): 匹配state行才执行后面的操作
sub(/>[^<]*</,">2<")
=sub(/正则/,"b"),用b替换正则匹配的内容
其中的 />[^<]*</ 为:
匹配 >...< 的意思
[^<]* 及不是<的多个字符
所以这句话就是:匹配以<开头,直到第一个> !
hyhappy 发表于 2008-01-10 21:31
首先感谢光明使者,精灵你们二位,哈哈。
<state>1</state>
awk '{if(/state/){sub(/>[^<]*</,">2<")}print}' urfile
这条命令难理解的就是/>[^<]*</这里了。我理解的是,匹配〉〈这个之间的内容,但是为什么[^<],看精灵解释说不是<的多个字符,但是〉〈里面已经没有〈这个符号了,为什么还要排除呢。 搞不懂。
7717060 发表于 2008-01-10 22:07
<?xml version="1.0" encoding="UTF-8"?>
<address xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="add.xsd">
<group groupname="default">
<entry>
<id>0001</id>
<name>wds</name>
<persioninfo>
<age>24</age>
<work>student</work>
<birtyday>1984</birtyday>
<qq>125153052</qq>
</persioninfo>
<connect>
<address>neusoft institute of informaction </address>
<tel>
<office>84835207</office>
</tel>
<email href="mailto:7717060@163.com"/>
</connect>
</entry>
</group>
</address>
#!/bin/bash
#-----------------------------------------------------------------------------------
# filename: main.sh |
# author: wds |
# begin: 2008.1.1 |
# end: 2008.1.4 |
# version: v.1 |
#-----------------------------------------------------------------------------------
xmladd=add.xml
xmltemp=.temp2
tim=$(date)
count=$(more $xmladd | wc -l)
function exitt()
{
rm -rf $xmltemp
exit
}
function memo()
{
clear
echo
echo "----------------------------------------------------------------------------------------------"
echo "| **************************** |"
echo "| * This is XML Homework * |"
echo "| * Author: wds * |"
echo "| * Address List * |"
echo "| **************************** |"
echo "| |"
echo "| 1.Show Informaction |"
echo "| 2.Add Informaction |"
echo "| 3.Del Informaction |"
echo "| 4.Change Infromaction |"
echo "| 5.Select Infromcation |"
echo "| 6.Help |"
echo " 7.Exit |"
echo "| |"
echo "______________________________________________________________________________________________"
}
function add()
{
clear
echo "please input your informaction!"
echo -n "id: -->" ; read id
echo -n "name:-->"; read nam
echo -n "age: -->"; read age
echo -n "work:-->"; read work
echo -n "birthday[year-month-day]: -->" ; read birthday
echo -n "qq: -->"; read qq
echo -n "address: -->>" ; read address
echo -n "office: -->>" ; read office
echo -n "email: -->>" ; read mail
echo " " >> $xmladd
echo "<entry>" >> $xmladd
echo "<id>$id</id>" >> $xmladd
echo "<name>$name</name>" >> $xmladd
echo "<persion info>" >>$xmladd
echo "<age>$age</age>" >> $xmladd
echo "<work>$work</work>"
echo "<birthday>$birthday</birthday>" >> $xmladd
echo "<qq>$qq</qq>" >>$xmladd
echo "</persion info>" >> $xmladd
echo "<connect>" >> $xmladd
echo "<address>$address</address>" >> $xmladd
echo "<tel>" >>$xmladd
echo "<office>$office</office>" >> $xmladd
echo "</tel>" >> $xmladd
echo "<email href="mailto:$mail">" >> $xmladd
echo "</connect>" >>$xmladd
echo "</entry>" >>$xmladd
}
function error()
{
clear
echo "sorry please input [1-6]:"
sleep 2
memo
}
#-------------------------------------------------------------------------------------------------
function show()
{
echo "--------------------------------------------------------------------------------------------"
cat $xmladd
echo "--------------------------------------------------------------------------------------------"
echo "Now is $tim page have $count line:"
echo "--------------------------------------------------------------------------------------------"
echo "Do you want save your informcation(y/Y)"
echo -n "-->"; read answer
if [ "$answer" = "y" -a "$answer" = "Y" ]
then
echo "</group>" >> $xmladd
echo "</address>" >> $xmladd
else
continue
fi
}
function del()
{
echo "please input id:"
echo -n "id: -->"; read id
delnum=$(more $xmladd | grep -n "$id" | cut -d: -f1)
echo "$delnum" >> ww
delnum=$(expr $delnum - 1 )
pageup=$delnum
echo "$pageup" >>ww
delnum=$(expr $delnum + 16 )
pagedown=$delnum
echo "$pagedown" >>ww
cat $xmladd | sed "$pageup,"$pagedown"d" > .temp
more .temp > $xmladd
rm -rf .temp
echo "delete OK!!!"
sleep 1
}
function change()
echo "Please Input Id:"
echo -n "id: -->"; read id
delnum=$(more $xmladd | grep -n "$id" | cut -d: -f1)
delnum=$( expr $delnum - 1 )
pageup=$delnum
delnum=$( expr $delnum + 15 )
pagedown=$delnum
cat $xmladd | sed -n "$pageup,"$pagedown"p"
echo -n "New id: -->" ; read id
echo -n "New name:-->"; read name
echo -n "New age: -->"; read age
echo -n "New work:-->"; read work
echo -n "New birthday[year-month-day]: -->" ; read birthday
echo -n "New qq: -->"; read qq
echo -n "New address: -->>" ; read address
echo -n "New office: -->>" ; read office
echo -n "New email: -->>" ; read mail
echo "<entry>" >> $xmltemp
echo "<id>$id</id>" >> $xmltemp
echo "<name>$name</name>" >> $xmltemp
echo "<persion info>" >>$xmltemp
echo "<age>$age</age>" >> $xmltemp
echo "<work>$work</work>" >> $xmltemp
echo "<birthday>$birthday</birthday>" >> $xmltemp
echo "<qq>$qq</qq>" >>$xmltemp
echo "</persion info>" >> $xmltemp
echo "<connect>" >> $xmltemp
echo "<address>$address</address>" >> $xmltemp
echo "<tel>" >>$xmltemp
echo "<office>$office</office>" >> $xmltemp
echo "</tel>" >> $xmltemp
echo "<email href="mailto:$mail">" >> $xmltemp
echo "</connect>" >>$xmltemp
echo "</entry>" >>$xmltemp
cat $xmladd | sed "$pageup,"$pagedown"d" > .temp
more .temp > $xmladd
more $xmltemp >> $xmladd
}
function selectt()
{
while :
do
echo "Please Input Id:"
echo -n "id: -->"; read id
delnum=$( expr $delnum - 1 )
pageup=$delnum
delnum=$( expr $delnum + 15 )
pagedown=$delnum
cat $xmladd | sed -n "$pageup,"$pagedown"p"
echo -n "Back enter (e/E) continue select (*)"; read answer
if [ "$answer" = "E" -o "$answer" = "e" ]
then
return memo
else
continue
fi
done
}
function help()
{
while :
do
clear
echo "
1.show: funciton show it's can list all the informaction of xml.
2.add: function add it's can insert into your need informcation to the xml.
3.del: function del it's can delete informaction from you xml.
4.change: function change if xml have some informcation you dont need you can change use this function.
5.select: function select if your xml have a lots of informcation you can use this function to select your need informcaction.
6.help: fucntion help is help your how to use this software
7.exit: quit
"
echo -n "Go back to then memo!(Y/y)"; read answer
if [ "$answer" = "y" -o "$answer" = "Y" ]
then
return memo
else
continue
fi
done
}
while :
do
memo
echo "please input your choice:"
read choice
case "$choice"
in
1 ) show ;;
2 ) add ;;
3 ) del ;;
4 ) change ;;
5 ) selectt;;
6 ) help ;;
7 ) exitt ;;
* ) error;;
esac
done
[[i] 本帖最后由 7717060 于 2008-1-10 22:12 编辑 [/i]]
jinl 发表于 2008-01-10 23:25
[quote]原帖由 [i]hyhappy[/i] 于 2008-1-10 21:31 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7835443&ptid=1040744][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
首先感谢光明使者,精灵你们二位,哈哈。
1
awk '{if(/state/){sub(/>[^ [/quote]
/>[^<]*/</ 匹配> 开始任意个非<字符,并以<结束
为什么要用[^<]来匹配>...<这样形式的内容,又涉及到正则表达式的最长匹配原则
如果用/>.*</来匹配,那么如果遇到 <>1<>2<>这样的字符串,将匹配最长的>..<
即1<>2为匹配内容,而不是你需要的1作为匹配内容,所以/>[^<]*</将确保匹配第一个><中间的内容
请教shell读写XML问题的更多相关文章
- Linux Shell脚本读写XML文件
在Linux下如何用Shell脚本读写XML?现有一个config.xml <?xml version="1.0" encoding="UTF-8"?&g ...
- 在Linux下如何用Shell脚本读写XML?现有一个config.xml(转)
在Linux下如何用Shell脚本读写XML?现有一个config.xml <?xml version="1.0" encoding="UTF-8"?&g ...
- PHP怎么读写XML?(四种方法)
PHP怎么读写XML?(四种方法) 一.总结 1.这四种方法中,字符串的方式是最原始的方法.SimpleXML和DOM扩展是属于基于树的解析器,把整个文档存储为树的数据结构中,需要把整个文档都加载到内 ...
- C#读写xml文件的常用方法
已知有一个XML文件(bookshop.xml)如下: <?xml version="1.0" encoding="gb2312" ?> <b ...
- PHP读写XML文件的四种方法
PHP对XML文件进行读写操作的方法一共有四种,分别是:字符串方式直接读写.DOMDocument读写. XMLWrite写和XMLReader读.SimpleXML读写,本文将依次对这四种方法进行介 ...
- 在.net中序列化读写xml方法的总结
在.net中序列化读写xml方法的总结 阅读目录 开始 最简单的使用XML的方法 类型定义与XML结构的映射 使用 XmlElement 使用 XmlAttribute 使用 InnerText 重命 ...
- ADO.NET 快速入门(六):读写 XML
ADO.NET 和 DataSet 可以读写 XML Schema 和 XML.获取更多信息,请参考 How do I...Use XML and the DataSet? DataSet 的 S ...
- C#_在.net中序列化读写xml方法的总结
阅读目录 开始 最简单的使用XML的方法 类型定义与XML结构的映射 使用 XmlElement 使用 XmlAttribute 使用 InnerText 重命名节点名称 列表和数组的序列化 列表和数 ...
- Java 读写XML文件 API--org.dom4j
om4j是一个Java的XML API,类似于jdom,用来读写XML文件的.dom4j是一个十分优秀的JavaXML API,具有性能优异.功能强大和极其易使用的特点,同时它也是一个开放源代码的软件 ...
- Fixflow引擎解析(三)(模型) - 创建EMF模型来读写XML文件
Fixflow引擎解析(四)(模型) - 通过EMF扩展BPMN2.0元素 Fixflow引擎解析(三)(模型) - 创建EMF模型来读写XML文件 Fixflow引擎解析(二)(模型) - BPMN ...
随机推荐
- PerfView专题 (第十五篇): 如何洞察 C# 中的慢速方法
一:背景 1. 讲故事 在 dump 分析旅程中,经常会遇到很多朋友反馈一类问题,比如: 方法平时都执行的特别快,但有时候会特别慢,怎么排查? 我的方法第一次执行特别慢,能看到慢在哪里吗? 相信有朋友 ...
- Spring—bean的作用域
beans的作用域 单例模式(Spring默认模式) <?xml version="1.0" encoding="UTF-8"?> <bean ...
- 【WebGL系列-04】清除缓冲区并绘制图形
清除缓冲区并绘制图形 前文中已经准备好了webgl程序和绘制所用的数据,但是在绘制图像之前,还要对画布进行处理. 清除缓冲区 由于图像的绘制是一帧一帧绘制,每一帧针对当前的状态,计算屏幕上每个像素的颜 ...
- 【go语言】2.4.2 自定义包的创建和使用
在 Go 中,任何一个目录都可以被视为一个包.创建自定义包的基本步骤是: 新建一个目录,用于存放包的源文件. 在新建的目录中编写 Go 代码,代码的第一行应该是 package 包名. 使用 impo ...
- pthon之字典的遍历
对字典的操作稍有些陌生,在此记录一下. 字典的使用已{key:value}的形式存在,多个值以逗号分开. 字典的遍历共有三种方法,他们将返回类似列表的值,分别对应字典的键.值.键-值对.即keys() ...
- python-gitlab 一个简单demo
背景 需要收集git仓库信息到数据库供前端展示 包括:仓库信息.仓库所有者.成员列表.提交信息.活跃情况等 需要定时启动.灵活触发 实现简介 使用gitlab v4 restful 接口 使用pyth ...
- SpringSecurity1: spring boot web 样例快速体验
本文只讲操作实践,不讲原理,这样对于想快速搭建起一个基于SpringSecurity的Web项目的朋友们而言,比较友好.文章主要由两部分构成: 快速演示样例 所有账户和授权数据均基于内存,能在极短的时 ...
- Prompt Playground 7月开发记录(2): Avalonia 应用开发
Prompt Playground 7月开发记录(2): Avalonia 应用开发 仅以此文记录开发过程中遇到的问题和个人的解决方案,如若有理解偏差或者更好的解决方案,欢迎指正. 客户端的开发的确不 ...
- 【Unity3D】反射和折射
1 前言 立方体纹理(Cubemap)和天空盒子(Skybox)中介绍了生成立方体纹理和制作天空盒子的方法,本文将使用立方体纹理进行采样,实现反射.菲涅耳反射和折射效果.另外,本文还使用了 Gra ...
- [ABC148F] Playing Tag on Tree
2023-03-04 题目 题目传送门 翻译 翻译 难度&重要性(1~10):5 题目来源 AtCoder 题目算法 最短路 解题思路 考虑到 T 想活得久, A 想尽早追上 T ,所以我们就 ...