请教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|grepn"id" | cut -d: -f1)                                                          
delnum=(exprdelnum - 1 )
pageup=delnumdelnum=( expr delnum+15)pagedown=delnum
cat xmladd|sedn"pageup,"pagedown"p"echon"Newid:>";readidechon"Newname:>";readnameechon"Newage:>";readageechon"Newwork:>";readworkechon"Newbirthday[yearmonthday]:>";readbirthdayechon"Newqq:>";readqqechon"Newaddress:>>";readaddressechon"Newoffice:>>";readofficeechon"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 >> 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作为匹配内容,所以/>[^<]*</将确保匹配第一个><中间的内容 

posted on   gogoy  阅读(165)  评论(0编辑  收藏  举报

编辑推荐:
· 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的强缓存和协商缓存
· 一文读懂知识蒸馏

导航

< 2011年6月 >
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 1 2
3 4 5 6 7 8 9
点击右上角即可分享
微信分享提示

目录导航