2014-08-30 124 views
-1
port.properties 
{ 
    "port":3006 
    "name":"John" 
} 

changeport.sh的sed:-e表達式#1,燒焦7:未結束的'S'命令

filename="port.properties" 
oldport=$(awk -F'"port":|,' '{i=$2;print i}' "$filename") 
read newport 
oldport_str="\"port\":$oldport" 
newport_str="\"port\":$newport" 

sed -i "s/$oldport_str/$newport_str/g" "$filename" 

我不知道你有答案了error.If,請告訴我,謝謝

+0

在第1行字符7中,「s」命令未終止。我甚至不知道這種語言,但錯誤信息是不言而喻的。我敢打賭,我可以通過幾秒的努力解決語法問題。你有沒有嘗試過? – 2014-08-30 03:27:05

+0

我認爲這是你的變量中存在的引號。 – 2014-08-30 03:28:08

+0

問題是從「舊端口」從port.properties讀取的變量,如果我只是在腳本中設置「舊端口」值或通過命令輸入,這是正確的。是否有不同呢? – JohnKery 2014-08-30 03:49:15

回答

1

舊值的東西關閉;它包含一個不可見的字符(DOS回車?)或者你沒有顯示的東西。

無論如何,使用正則表達式尋找舊值只是因爲您可以替換它並不能防止這裏發生任何事故,所以最簡單的解決方法是刪除讀取舊值的部分。

read newport 
sed -i "s/\(\"port\":\).*/\1$newport/" port.properties 

一些sed方言不需要捕獲括號之前的反斜槓;在提交任何內容之前先試驗你的版本的精確語法。

+0

awk腳本的'-F'參數的'|''部分表明,也許你並沒有真正向我們展示輸入文件的樣子。如果實際情況不同,那麼顯然你必須調整解決方案。 – tripleee 2014-08-30 06:45:14

1

只是改變了整個事情的簡單:

filename="port.properties" 
read -r newport 
awk -v new="$newport" 'BEGIN{FS=OFS=":"} $1~/"port"/{$2=new} 1' "$filename" > tmp && 
mv tmp "$filename" 

以上會無論是在你的文件中哪些字符工作或讀取輸入的字符串。