请教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
[Math Processing Error](more
xmladd|grep−n"id" | cut -d: -f1)
delnum=
(exprdelnum - 1 )
pageup=
delnumdelnum=( expr
delnum+15)pagedown=delnum
cat
xmladd|sed−n"pageup,"
pagedown"p"echo−n"Newid:−−>";readidecho−n"Newname:−−>";readnameecho−n"Newage:−−>";readageecho−n"Newwork:−−>";readworkecho−n"Newbirthday[year−month−day]:−−>";readbirthdayecho−n"Newqq:−−>";readqqecho−n"Newaddress:−−>>";readaddressecho−n"Newoffice:−−>>";readofficeecho−n"Newemail:−−>>";readmailecho"<entry>">>xmltemp
echo "<id>
id</id>">>xmltemp
echo "<name>
name</name>">>xmltemp
echo "<persion info>" >>
xmltempecho"<age>age</age>" >>
xmltempecho"<work>work</work>" >>
xmltempecho"<birthday>birthday</birthday>" >>
xmltempecho"<qq>qq</qq>" >>
xmltempecho"</persioninfo>">>xmltemp
echo "<connect>" >>
xmltempecho"<address>address</address>" >>
xmltempecho"<tel>">>xmltemp
echo "<office>
office</office>">>xmltemp
echo "</tel>" >>
xmltempecho"<emailhref="mailto:mail">" >>
xmltempecho"</connect>">>xmltemp
echo "</entry>" >>
xmltempcatxmladd | sed "
pageup,"pagedown"d" > .temp
more .temp >
xmladdmorexmltemp >>
[Math Processing Error]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作为匹配内容,所以/>[^<]*</将确保匹配第一个><中间的内容
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏