shell修改xml.docx

上传人:b****7 文档编号:8793725 上传时间:2023-02-01 格式:DOCX 页数:14 大小:20.61KB
下载 相关 举报
shell修改xml.docx_第1页
第1页 / 共14页
shell修改xml.docx_第2页
第2页 / 共14页
shell修改xml.docx_第3页
第3页 / 共14页
shell修改xml.docx_第4页
第4页 / 共14页
shell修改xml.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

shell修改xml.docx

《shell修改xml.docx》由会员分享,可在线阅读,更多相关《shell修改xml.docx(14页珍藏版)》请在冰豆网上搜索。

shell修改xml.docx

shell修改xml

【例1】

配置文件:

test.txt

xmlversion="1.0"encoding="utf-8"?

>

launcher="

    

      launcher:

className="com.mediatek.clockwidget.ClockAppWidgetProvider"

      launcher:

screen="3"

      launcher:

spanY="2"/>

    

      launcher:

className="com.android.quicksearchbox.SearchWidgetProvider"

      launcher:

screen="3"

      launcher:

spanY="1"/>

    

      launcher:

className="com.android.browser.BrowserActivity"

      launcher:

screen="3"

      launcher:

y="3"/>

    

      launcher:

className="com.sec.chaton.HomeActivity"

      launcher:

screen="3"

      launcher:

y="3" />

    

      launcher:

className="com.mediatek.videoplayer.VideoWidgetProvider"

      launcher:

screen="4"

      launcher:

spanY="2"/>

    

      launcher:

className="com.android.music.MediaAppWidgetProvider"

      launcher:

screen="4"

      launcher:

spanY="2"/>

需要在脚本中找到指定的className如:

com.sec.chaton.HomeActivity,修改其所在段的launcher:

y属性;

之前是现学修改单行文本,搞个这种不知道怎么处理了;哪位大侠帮忙分析一下怎么处理

网上回答:

方案

(1)

可以试试下面的命令:

1.sed'/^[[:

space:

]]*launcher:

className="com.sec.chaton.HomeActivity"$/{n;n;s/launcher:

y="[^"]*"/launcher:

y="XX"/}'  test.xml

复制代码

大概解释下:

首先是匹配launcher:

className=="com.sec.chaton.HomeActivity",不知道这行前有没有空格或制表符所以加上了[[:

space:

]] 

然后{n;n;s/launcher:

y="[^"]*"/launcher:

y="XX"/}    ,n为将匹配行的下一行加入到模式空间,所以加上了两个n,直接到匹配行的第二行,s替换不多说了,要说明下"[^"]"这个:

只是要确保"值",这个值没有",但如果楼主觉得没必要判断,那也没什么必要,直接y=.*/>就好了。

但如果我们要修改这个值,我觉得判断一下准确些

方案

(2)

想到个不是很严谨的

1.sed  '/className="com.sec.chaton.HomeActivity"/{:

a;n;s/\(launcher:

y=\).*/\1xxx/;tb;ba;:

b}'test.txt

复制代码

xxx为要修改的launcher:

y属性

 

【例2】shellsed命令修改键值对以及修改值

1.如需要修改如下键值对

/certfile"/>

sed命令:

sed's#CERT_PATH.*$#CERT_PATH\"        value=\"/opt/SUR/ReportServer/bin/workspace/conf/DPIConfig\"/>#g'DpiConfig.xml

解释:

sed's#键.*$#需要修改的内容(它会从键后面的全部替换也就是【

注意有些特殊字符需要用“\”转义字符匹配。

2.修改IP地址

sed-i's/SMM_BOARD_IP=[0-9]*.[0-9]*.[0-9]*.[0-9]*/SMM_BOARD_IP=修改后的值/g'文件路径

3.修改数值

 sed-i's/SMM_BOARD_SNMP_Port=[0-9]*/SMM_BOARD_SNMP_Port=修改后的值/g'  文件路径

4.修改字符串

 sed-i's/SMM_BOARD_SNMP_Port=[a-zA-Z]*/SMM_BOARD_SNMP_Port=修改后的值/g'  文件路径

注:

有时候使用命令修改,在控制台可以看到修改了,但是实际进入文件查看,没有修改,此时要先把文件另存为,然后移除原来的文件,最后再把另存为的文件改为原来的文件名

如:

先另存为文件:

sed's|CERT_PATH.*$|CERT_PATH\"        value=\"/opt/SUR/ReportServer/bin/workspace/conf/DPIConfig\"/>|g'> DpiConfigTmp.xml

移除原来的文件:

rm-fDpiConfig.xml

再把另存为的文件改为原来的文件名:

mvDpiConfigTmp.xmlDpiConfig.xml

 

【例3】shell,sed修改指定位置的文本中的指定内容

/b/xx即在目录b下存在一个文件xx,文件xx的内容如下

123224rsiskd1

sdfkldsfjkslf2

fdsjlfjlsdf3

fdjsofjs;f4

fjdsfdksfkd5

dsfkjgds6

现在,我想在的前面一行,也就是dsfkjgds6和之间添加一行文字,文字如下

请问应该如何写?

------解决方案--------------------

Assemblycode

[root@RHEL6Atmp]#catdata7.txt

123224rsiskd1

sdfkldsfjkslf2

fdsjlfjlsdf3

fdjsofjs;f4

fjdsfdksfkd5

dsfkjgds6

[root@RHEL6Atmp]#awk'{if($0=="")printf("%s\n\n",$0);elseprint$0}'data7.txt

123224rsiskd1

sdfkldsfjkslf2

fdsjlfjlsdf3

fdjsofjs;f4

fjdsfdksfkd5

dsfkjgds6

[root@RHEL6Atmp]#

【例4】如何方便的使用shell脚本来解析xml文件

最近在项目中,需要用到shell脚本来解析xml文件。

在网上搜了一下,发现有xmlsh等可以用,但是都需要下载安装,使用比较麻烦,后来经过查找在stackoverflow上找到了解决方法,将脚本记录如下。

   项目中的主要需求为:

在xml文件中,需要配置连接的服务器的IP和端口号等信息,供游戏逻辑程序作为服务的客户端进行解析使用。

但同时,这些IP和端口号也是在进行服务器部署时需要配置的,因而这份配置在两个地方需要用到。

   一开始考虑到服务器部署脚本中解析文本方便一些,因而同一份配置编写了2份。

但后来考虑到后续部署的方便和较少人工配置出错的可能性,因而想到直接在部署脚本中使用xml文件来配置服务器的IP和端口号相关信息。

具体脚本如下:

[html] viewplaincopy

1.#!

/bin/sh  

2.  

3.Usage()  

4.{  

5.        echo "Usage:

 ./install_all.sh "  

6.        exit 1  

7.}  

8.  

9.if [ $# -ne 1 ]  

10.then  

11.        Usage  

12.fi  

13.  

14.if [ !

 -e "$1" ]  

15.then  

16.        echo "fail to load data from file, file $1 not exist!

"  

17.        exit 1  

18.fi  

19.  

20.attrget()  

21.{  

22.        ATTR_PAIR=${1#*$2=\"}  

23.        echo "${ATTR_PAIR%%\"*}"  

24.}  

25.  

26.install_all_svrs()  

27.{  

28.        if [ $# -ne 1 ]  

29.        then  

30.                echo "Invalid call of function install_all_svrs, no input file!

"  

31.                exit 1  

32.        fi  

33.  

34.        local IFS=\>  

35.  

36.        while read -d \< ENTITY CONTENT  

37.        do  

38.                TAG_NAME=${ENTITY%% *}  

39.                ATTRIBUTES=${ENTITY#* }  

40.  

41.                if [[ $TAG_NAME == "group" ]]  

42.                then  

43.                        GROUP=`attrget ${ATTRIBUTES} "id"`  

44.                        HOST=`attrget ${ATTRIBUTES} "host"`  

45.                        PORT=`attrget ${ATTRIBUTES} "port"`  

46.                        HTTPPORT=`attrget ${ATTRIBUTES} "httpport"`  

47.  

48.                        echo "./install.sh $GROUP $HOST $PORT $HTTPPORT"  

49.                        ./install.sh $GROUP $HOST $PORT $HTTPPORT  

50.                fi  

51.        done < $1  

52.}  

53.  

54.install_all_svrs $1  

55.  

56.#while read -d  

57.#do  

58.#       var=`echo ${line} | awk '$1 ~/^[0-9]+$/ {print $1}'`  

59.#       if [ -z ${var} ]  

60.#       then  

61.#               continue;  

62.#       fi  

63.  

64.#       ./install.sh $line  

65.  

66.#done < $1  

   其中,xml文件的解析代码主要在install_all_svrs函数中。

具体原理主要还是利用shell的字符串处理技巧,下面主要分析几个主要的技巧:

   ${StrName%%TAG*}表示截取字符串从左向右的第一个TAG之前的字符串;

   ${StrName#*TAG}表示截取字符串从左向右的第一个TAG分割的之后的字符串,包含TAG;

   ${StrName%%TAG}表示截取字符串从左向右的第一个TAG分割之前的字符串,不包含TAG;

【例5】请问如何利用shell脚本读取配置文件(.xml文件)中的信息

.xml文件内容类似如下:

 

[html] 

xmlversion="1.0"encoding="UTF-8"?

 

 

1 

192.168.1.100 

 

 

2 

192.168.1.200 

 

 

[/html] 

请问如何在shell脚本中读取指定的信息赋给一个变量?

 

比如在脚本中读取这个文件,获取ID为2的主机的IP给变量HOSTIP?

 

谢谢!

是想弄一个通用的方法,自己用c写个接口,下面是用sed,grep,awk处理你这个问题的,不具有一般性 

Shell代码 

1.sed -e :

a -e 'N;s/\n//;ta;' file.txt | grep -o "2.*" | awk -F "[<>]" '{print $7}'  

【例6】利用shell脚本文本过滤XML文件-awk工具

源文件

xmlversion="1.0"encoding="UTF-8"?

>

---------------------

格式化输出文件

ID:

123artist:

linkinparktitleIntheend

ID:

456artist:

arviltitlething'syouneverknow

---------------------

文本过滤的shell脚本(写的很实用)

#!

/bin/bash

XML_FILE_NAME=$1

grep"lrc"${XML_FILE_NAME}|cut-d'"'-f2,4,6 | awk'BEGIN{FS="\""}{id[NR]=$1;artist[NR]=$2;title[NR]=$3}END{for(i=1;i

"id[i]"\tartist:

"artist[i]"\ttitle"title[i]}'

【例7】

举个例子:

一个xml文件内容是:

xmlversion="1.0"encoding="UTF-8"?

>

DOCTYPEplistPUBLIC"-//Apple//DTDPLIST1.0//EN""

    Executable

    test

        Delete

    delete

怎么实现删除Executable

    test

添加    Add

    add

到第七行?

回复#1deronjazz的帖子

sed  -e  '7i\\tAdd<\/key>\n\tadd<\/string>'-e'/Executable<\/key>/{N;d}'

【例8】shell处理xml,节点丢失

近来需要使用shell来处理XML文件。

1.通过shell脚本解析XML,获取节点名称和节点值

2.通过shell脚本动态生成XML。

拿到XXX部门发来得XML文件模板test.xml:

xmlversion="1.0"encoding="UTF-8"?

>

    

        

[CDATA[

            

                111

                1

                20111101000000

                20111130235959

                10086

                1355004

                

                

                                

        ]]>

    

XML文件中节点说明:

DataType            必须且只能填1项

ConsistencyType    必须且只能填1项

ValidTimeStart      可以没有

ValidTimeEnd        必须且只能填1项

UserRange          可以没有,也可以有多项

SPRange            可以没有,也可以有多项

Shell脚本taglist.sh:

#!

/bin/sh-

cat"$1"|

  sed-e's#systemitem*role="url"#URL#g'-e's#/systemitem#URL#'|

  tr'(){}[]''\n\n\n\n\n\n\n'|

      egrep'>[^<>]+

        awk-F'[<>]'-vFILE="$1"\

            '{print($2,$3)}'

#shtaglist.shtest.xml

DataType111

ConsistencyType1

ValidTimeStart20111101000000

ValidTimeEnd20111130235959

UserRange10086

UserRange1355004

通过执行Shell可以得出如上结果,但跟我的需求结果有些差异,我预想输出的应该是:

DataType111

ConsistencyType1

ValidTimeStart20111101000000

ValidTimeEnd20111130235959

UserRange10086

UserRange1355004

UserRange                        <-  这个UserRange因为节点没有值,这里应该是空值

SPRange                          <-  这个SPRange因为节点没有值,这里应该是空值

-------------------------------------------------------

请各位帮忙修改我的shell以达到我的预想输出结果。

谢谢!

回答:

方案一:

近来需要使用shell来处理XML文件。

1.通过shell脚本解析XML,获取节点名称和节点值

2.通过shell脚本动态生成XML。

拿到XXX部门发来得XML文件模板test.xml:

xmlversion="1.0"encoding="UTF-8"?

>

    

        

[CDATA[

            

                111

                1

                20111101000000

               

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 财务管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1