2011-12-22 161 views
11

標題說明了所有。我需要將我不知道的財產價值換成不同的價值。 我想要這樣的:從shell腳本編輯屬性文件中的屬性值

#!/bin/bash 
sed -i "s/myprop=[^ ]*/myprop=$newvalue/g" file.properties 

我得到sed: -e expression #1, char 19: unknown option to s'`

我認爲這個問題是$newvalue是代表一個目錄,以便它攪亂了sed的字符串。

我該怎麼辦?

+3

'/'只是爲了'sed'通常(但不是強制性的)分隔符。如果你嘗試別的東西,會發生什麼,比如pipe('|')? – 2011-12-22 16:45:44

+0

@DanFego工作!我花了很長時間才意識到我的var字符串中的'/'是問題所在。忘了你可以切換sed分隔符。謝謝 – Michael 2011-12-22 16:50:03

+1

爲什麼你根本用「g」修飾符? – fge 2011-12-22 16:51:29

回答

7

sed可以使用除/以外的字符作爲分隔符,儘管/是最常見的。在處理諸如路徑名之類的東西時,使用諸如管道(|)之類的東西通常會很有幫助。

+0

對於某些seds,您需要'逃避'非標準reg-ex分隔符的第一個實例,如's \ | srch | repl |'。祝你們好運。 – shellter 2011-12-22 17:18:21

7

如果你的屬性文件的分隔與=籤這樣的 -

param1=value1 
param2=value2 
param3=value3 

那麼你可以使用awk確實因剛知道PARAM名 modifiy的參數值的方式。舉例來說,如果我們要修改的param2在你的屬性文件,我們可以做如下 -

awk -F"=" '/param2/{$2="new value";print;next}1' filename > newfile 

現在,上面one-liner需要你硬編碼參數的時新的價值。如果您在shell腳本中使用它,並且需要從變量中獲取新值,則情況可能不是這種情況。

在這種情況下,你可以做以下 -

awk -F"=" -v newval="$var" '/param2/{$2=newval;print;next}1' filename > newfile 

在此,我們創建一個awk變量newval,並與您的腳本變量($ VAR),其中包含新的參數值初始化。

+0

如果我想在結尾添加新行(如果該屬性不存在)該怎麼辦? – 2015-08-04 13:33:42

+0

我試過'awk'命令,但它從輸出中去掉'=',所以最終將'HOSTNAME = oldvalue'轉換爲'HOSTNAME newvalue' - 任何想法我錯了什麼? – 2016-05-20 11:46:59

+1

@Oly您需要設置OFS變量。所以'awk -F'='-v OFS ='='...' – 2016-05-20 13:08:58