2016-11-25 58 views
2

我做了一個腳本,應該修改它看起來像這樣的事情文件的變量的值:修改線的一部分

smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination 
myhostname = triton.itinet.fr 
alias_maps = hash:/etc/aliases 
alias_database = hash:/etc/aliases 
myorigin = /etc/mailname 
mydestination = triton, localhost.localdomain, localhost 

relayhost = smtp.free.fr 
home_mailbox = Maildir/ 

virtual_mailbox_domains = $myhostname 
virtual_mailbox_base = /var/mail/ 
virtual_mailbox_maps = hash:/etc/postfix/vmailbox 

virtual_uid_maps = static:5000 
virtual_gid_maps = static:5000 
#virtual_alias_maps = hash:/etc/postfix/virtual   

我想修改的值用戶進入中繼主機,我已經做到了這一點

modify_relayhost() 
{ 
    read new_relayhost 
    if (test -e /etc/postfix/main.cf) 
    then 
     grep "relayhost" /etc/postfix/main.cf | cut -d= -f1 && echo $new_relayhost 
    fi  
} 

但它不修改文件,它只是打印我說值稱爲中繼主機和寫入用戶的一個上的提示

+1

這可以幫助你:http://stackoverflow.com/questions/11145270/bash-replace-an-entire-line-in-a-text-file – OscarAkaElvis

回答

1

你可以做到這一點一個sed逗號第二:

read new_relayhost 

sed -i.bak -E 's/^([ \t]*relayhost[ \t]*=[ \t]*).*/\1'"$new_relayhost"'/' /etc/postfix/main.cf 

sed命令查找relayhost鍵通過可選的空間包圍,取代它的價值的一部分變$new_relayhost的價值。

1

這個簡單的bash腳本可以做到這一點。現在用的是read命令來讀取更換

#!/bin/bash 

read -p "enter relayhost value: " relayhost 

if [ -f /etc/postfix/main.cf ]; 
then 
    sed -i.bak -r "s/(relayhost *= *).*/\1$relayhost/" /etc/postfix/main.cf 
fi 

用戶提示和sed運行腳本現在

$ bash script.sh 
enter relayhost value: abcd 
$ cat /etc/postfix/main.cf 
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination 
myhostname = triton.itinet.fr 
alias_maps = hash:/etc/aliases 
alias_database = hash:/etc/aliases 
myorigin = /etc/mailname 
mydestination = triton, localhost.localdomain, localhost 

relayhost = abcd 
home_mailbox = Maildir/ 

virtual_mailbox_domains = $myhostname 
virtual_mailbox_base = /var/mail/ 
virtual_mailbox_maps = hash:/etc/postfix/vmailbox 

virtual_uid_maps = static:5000 
virtual_gid_maps = static:5000 
#virtual_alias_maps = hash:/etc/postfix/virtual 
1

使用Perl:

host='new.host' 

perl -pi.orig -e 's/^(\s*relayhost\s*=).*$/\1'"$host"'/' /etc/postfix/main.cf 

隨着-p選項,perl就像一個過濾器類似於grepsed。它實際上增加了while (<>)循環,該循環逐行讀取輸入,並將結果(由於-i選項)打印到文件中。

-i.orig選項創建原始文件的備份副本(main.cf.orig),並就地修改文件。

substitution適用於文件中的每一行。它捕獲左邊部分(\s*relayhost\s*=),並用新值($host)加入。

請注意,替換僅適用於第一次匹配。如果要替換所有出現的變量,請使用g修飾符。