注意有些特殊字符需要用“\”转义字符匹配。
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