2013-03-27 55 views
0

我正在寫我的函數來將文件中的有效選項替換爲我的設置。 的1.txt的是這樣的:sed使用字符串包含空間的參數

PasswordAuthentication yes 
PermitRootLogin yes 

My功能將處理文件,然後輸出等:

#PasswordAuthentication yes 
PasswordAuthentication no 
#PermitRootLogin yes 
PermitRootLogin no 

桑達參數是從由函數,sed_chain(產生的字符串),如下面: 問題是,如果有$ {模式}和$ {選項}之間的空間,然後我得到了錯誤: 的sed:-e表達式#1,焦炭46:未結束的'S'命令

如果有之間沒有空格他們,功能起作用,但這不是我想要的。

#!/bin/bash 
A="PasswordAuthentication no" 
B="PermitRootLogin no" 
F="/tmp/1.txt" 


sed_chain() { 
    args=("[email protected]") 
    file=${@:(-1)} 
    pattern_params="" 

    for i in $(seq 0 $(($#-2))) 
    do 
     pattern=$(echo ${args[$i]}|cut -d" " -f1) 
     option=$(echo ${args[$i]}|cut -d" " -f2) 
     echo $pattern 
     echo $option 

     pattern_params="-e s/^[^#]*${pattern}.*$/#&\n${pattern} ${option}/g $pattern_params" # failed 
     #pattern_params='-e s/^[^#]*'${pattern}'.*$/#&'"\n${pattern}${option}"'/g '${pattern_params} # passed 
     echo "*** $pattern_params ***" 
    done 

    sed $pattern_params $file 
} 


sed_chain "$A" "$B" "$F" 
+0

'$ pattern_params'回聲是什麼? – 2013-03-27 05:08:51

+0

它只是用於調試$ pattern_params的內容 – timchen 2013-03-27 05:12:25

+0

是的,你到達那裏? – 2013-03-27 05:12:41

回答

0

嘗試在表達式周圍打包單引號。

pattern_params="-e 's/^[^#]*${pattern}.*$/#&\n${pattern} ${option}/g' $pattern_params" 
+0

它會產生另一個錯誤: sed:-e表達式#1,字符1:未知命令:''' – timchen 2013-03-27 05:23:54

+0

對不起,stackoverflow評論系統正在吃你的評論 – 2013-03-27 05:24:58

0

我有一種解決方法,而不是所有的參數組合成一個,我通過一個用於每個參數運行sed命令之一。它工作正常。但是我仍然想知道如何將這些參數合併爲一個。

sed_chain() { 
    args=("[email protected]") 
    file=${@:(-1)} 

    for i in $(seq 0 $(($#-2))) 
    do 
     pattern=$(echo ${args[$i]}|cut -d" " -f1) 
     option=$(echo ${args[$i]}|cut -d" " -f2) 
     echo $pattern 
     echo $option 

     pattern_param="s/^[^#]*${pattern}.*$/#&\n${pattern} ${option}/g" 

     sed -i -e "$pattern_param" $file 
    done 


} 
0

這是否 [[:空間:]] 也許工作?

相關問題