【问题标题】:Modify a part of a line on a file修改文件上一行的一部分
【发布时间】:2017-04-10 01:04:49
【问题描述】:

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

    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 的值并在提示符上写入用户的值

【问题讨论】:

标签: bash shell file line


【解决方案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 修饰符。

【讨论】:

    【解决方案2】:

    这个简单的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
    

    【讨论】:

      【解决方案3】:

      您可以在单个 sed 命令中执行此操作:

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

      sed 命令查找被可选空格包围的relayhost 键,并将其值部分替换为变量$new_relayhost 的值。

      【讨论】:

        猜你喜欢
        • 2023-01-17
        • 1970-01-01
        • 2013-07-31
        • 1970-01-01
        • 2014-11-12
        • 2017-09-06
        • 1970-01-01
        • 2021-12-31
        • 2013-06-09
        相关资源
        最近更新 更多