2014-03-30 195 views
0

嘿,我是新手到網站。我正在編寫一個安裝和配置Samba的bash腳本。我正在使用提示要求用戶輸入IP地址,然後我想使用輸入並將其放入smb.conf文件中的「hosts allow =」。我試過使用這個命令:使用sed來查找和替換smb.conf文件中的文本

sed -i "/${line}/ s/^${line} */${get_ip}/" /etc/samba/smb.conf 

但它刪除hosts allow =在文件中。如果有人能幫助我,我會深表謝意。

我的sed命令中使用的變量是

line="hosts allow =" 
get_ip=`hostname -I` 

回答

1

您需要使用&(什麼是匹配) 「經營者」 的sed的replacment串,即

sed -i "/${line}/ s/^${line} */&${get_ip}/" /etc/samba/smb.conf 

IHTH

1

您需要通過以下幾種方式修改腳本:

  1. hostname -I似乎與發行版相關,例如,相同版本1.100(2001-04-14)在CentOS 6.5中有-I選項,但在Gentoo中沒有。也許你可以使用try/catch塊來檢查它是否工作。
  2. 根據the specification,在大多數情況下,白色空間被忽略,所以如果不在行首,^${line}可能會丟失參數。
  3. /${line}/ s/${line} */${get_ip}/本質上是/p/ s/p/r/,您不需要指定地址範圍(/p/),因爲它與搜索模式相同,所以它相當於s/p/r/
  4. 如果您需要更換整個價值這個參數,你可以使用以下命令:

    sed -i "s/\(${line}\).*/\1 ${get_ip}/" /etc/samba/smb.conf 
    

    這意味着:對於由${line} +任何字符,直到行並更換結束一組搜索它與組+空間的內容+ ${get_ip}

  5. ,如果你需要將值追加到現有值,可以使用以下命令:

    sed -i "s/${line}.*/& ${get_ip}/" /etc/samba/smb.conf 
    

    這意味着:對於${line} +任意字符的搜索,直到行的結束,以及一切代替它的是匹配+空間+ ${get_ip}。實際上,只有當這個值只是同一行的一部分時,它纔會起作用,而不是帶有\延續符號的多行字符串(詳情請參閱here)。考慮到這種情況下使用下面的:

    sed -i "s/\(${line}[^\]*\)\([\]\?\)/\1 ${get_ip} \2/" /etc/samba/smb.conf 
    

    這意味着:兩個基團包括${line} +除了\任何字符(第一組)和零或\字符之一發生搜索(第二組),並將其替換爲第一組的內容+空格+ ${get_ip} +空格+第二組的內容。