2013-02-01 46 views
8

我有一個需求,我需要更改文件的內容,比如xyz.cfg。該文件包含如下值:通過shell腳本更改文件的內容

group address=127.8.8.8 
port=7845 
Jboss username=xyz_ITR3 

我想在需要時通過shell腳本更改此內容並保存該文件。更改的內容可以像:

group address=127.8.7.7 
port=7822 
Jboss username=xyz_ITR4 

我怎麼能實現通過利用用戶輸入或以其它方式使用這個shell腳本?

+0

你應該問一個具體問題的一個特殊問題。由於Stack Overflow隱藏了你的密切原因:*「有些問題要求我們推薦或查找書籍,工具,軟件庫,教程或其他非本地資源,因爲它們傾向於吸引自以爲是的答案和垃圾郵件,因此不適合Stack Overflow。 ,而是描述問題以及到目前爲止解決問題所做的工作。「* – jww

回答

23

如何像:

#!/bin/bash 

addr=$1 
port=$2 
user=$3 

sed -i -e "s/\(address=\).*/\1$1/" \ 
-e "s/\(port=\).*/\1$2/" \ 
-e "s/\(username=\).*/\1$3/" xyz.cfg 

$1,$2$3是傳遞給腳本的參數。這樣的文件保存爲script.sh,並確保它可執行文件chmod +x script.sh那麼你就可以運行它,如:

$ ./script.sh 127.8.7.7 7822 xyz_ITR4 

$ cat xyz.cfg 
group address=127.8.7.7 
port=7822 
Jboss username=xyz_ITR4 

這給你的基本結構,但是你將要考慮輸入驗證等。

+1

這完美地根據我的需要!謝謝 – user2031888

7
sed -i 's/something/other/g' filename.txt 

將編輯就地FILENAME.TXT和改字「東西」到「其他」

我認爲-i可能是一個GNU擴展,雖然,但如果是你,你還好嗎可以通過查找,xargs的等

添加它,如果你想改變它在一個shell腳本,您可以在命令行參數,並通過數字引用它們,例如:$ 1

編輯:

根據我的評論,sudo_O的答案正是你想要的例子。我要補充的是,通常你會想要使用多個文件進行匹配,跨越子目錄等,所以要了解find/xargs,並且可以將兩者結合起來。說的改變子網一堆.cfg的文件一個簡單的例子是:

find -name '*.cfg' -print0 | xargs -0 -I {} sed -ie 's/\(192.168\)\.1/\1\.7/' {} 

注意-print0/-0參數傳遞給查找/ xargs的(用空格的路徑/文件名非常有用),以及你要逃避,因爲殼的捕獲支架(以須藤的例子相同)

+0

>以及其他幾行我將在新文件中保持不變。那麼如何將這個新的內容與舊的一起? – user2031888

+0

我正要添加一個sudo_O的例子,但他的答案是去的;匹配/捕捉你關心的「鑰匙」,並讓其他人保持不變 – herdingofthecats

8

*

#! /bin/sh 
file=xyz.cfg 
addr=$1 
port=$2 
username=$3 
sed -i 's/address=.*/address='$addr'/' $file 
sed -i 's/port=.*/port='$port'/' $file 
sed -i 's/username=.*/username='$username'/' $file 

*

我希望這將是一個更容易理解,適合初學者

+0

謝謝你,之前從未使用過sed,也不知道接受的答案是怎麼回事 –