Linux Shell指令碼讀寫XML檔案

2022-01-29 05:16:18 字數 1572 閱讀 5895

在linux下如何用shell指令碼讀寫xml?現有乙個config.xml

<?xml  version="1.0" encoding="utf-8"?>

192.168.1.45

1209

/home/john

需要修改裡面的"server-ip", "server-port" and "import-path",用shell指令碼的引數$1,$2,$3來寫入。

思路1:用sed實現

首先想到的就是用sed正則匹配替換實現,寫了乙個shell指令碼,是這樣的:

#!/bin/sh

if [ $# -ne 3 ];then

echo "usage: argument 1:ip_address 2:server_port 3:temp_path"

exit 1

fiip=$1

port=$2

dirt=$3

echo "change values in config.xml..."

sed "s/.*/$/;s/.*/$/;s/.*/$/" config.xml > config.xml

echo "done."

測試下來呼叫$ ./abc.sh 192.168.1.6 9909 \\/home\\/abc"是可以的,但環境變數不行,例如:$ ./abc.sh 192.168.1.6 9909 $home\\/abc",因為首先環境變數被解析了,所以存在反斜槓轉義字元和sed替換衝突的問題。

用另外乙個思路實現

另外乙個思路是直接輸出該xml的內容,測試下來很管用,使用很方便,不存在反斜槓轉義字元的問題和環境變數的問題:

#!/bin/sh

if [ $# -ne 3 ];then

echo "usage: argument 1:ip_address 2:server_port 3:temp_path"

exit 1

fiip=$1

port=$2

dirt=$3

echo "change values in config.xml..."

cat 

<?xml  version="1.0" encoding="utf-8"?>$$

$eof  

echo "done."

思路3:用xmlstarlet

xml + shell = xmlstarlet

$ xmlstarlet ed -u /config/server-ip -v 192.168.1.6 -u /config/server-port -v 9909 -u /config/repository-temp-path -v /home/bbb input.xml

<?xml  version="1.0" encoding="utf-8"?>

192.168.1.6

9909

/home/bbb

思路4:用xsltproc

很多linux比如centos預設已安裝xsltproc,所以用xslt可以很方便的把乙個xml轉換為另外乙個xml。具體用法見這個網頁。

Linux Shell指令碼讀寫XML檔案

在linux下如何用shell指令碼讀寫xml?現有乙個config.xml xml version 1.0 encoding utf 8 config server ip 192.168.1.45 server ip server port 1209 server port repository ...

Linux Shell指令碼讀寫XML檔案

在linux下如何用shell指令碼讀寫xml?現有乙個config.xml 192.168.1.45 1209 home john 需要修改裡面的 server ip server port and import path 用shell指令碼的引數 1,2,3來寫入。思路1 用sed實現 首先想到...

Linux Shell指令碼基礎

shell指令碼在處理自動迴圈或大的任務方面可節省大量時間,且功能強大。任何指令碼都可能有注釋,加注釋需要此行的第乙個字元為 直譯器對此行不予解釋。指令碼不是複雜的程式,它是按行解釋的。指令碼第一行總是以 bin sh開始,這段指令碼通知shell使用系統上的 bourne shell直譯器。指令碼...