修改文件中某一行的一部分

时间:2016-11-25 15:28:36

标签: bash shell file line

我正在做一个应该修改文件变量值的脚本,看起来像这样:

    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        

我想通过用户条目修改relayhost的值,我已经完成了这个

    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    
}

但是它没有修改文件,它只是打印我的名为relayhost的值并在提示符下写入用户

3 个答案:

答案 0 :(得分: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 :(得分:1)

这个简单的bash脚本可以解决问题。我使用read命令读取用户提示,sed替换

#!/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

立即运行脚本

$ 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

答案 2 :(得分:1)

使用Perl:

host='new.host'

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

使用-p选项,perl的行为类似于 grep sed 的过滤器。它实际上添加了while (<>)循环,逐行读取输入,并打印结果(由于-i选项而导致文件。)

-i.orig选项会创建原始文件(main.cf.orig)的备份副本,并就地修改文件。

substitution适用于文件中的每一行。它捕获左侧部分(\s*relayhost\s*=)并将其与新值($host)连接。

请注意,替换仅适用于第一场比赛。如果要替换所有出现的变量,请使用g修饰符。