0

我正在编写函数以将文件中的有效选项替换为我的设置。1.txt 是这样的:

PasswordAuthentication yes
PermitRootLogin yes

我的函数将处理文件,然后输出如下:

#PasswordAuthentication yes
PasswordAuthentication no
#PermitRootLogin yes
PermitRootLogin no

sed 参数来自函数 sed_chain() 生成的字符串,如下所示: 问题是如果 ${pattern} 和 ${option} 之间有空格,则出现错误:sed: -e expression #1, char 46: 未终止的 `s' 命令

如果它们之间没有空间,则该功能有效,但这不是我想要的。

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


sed_chain() {
    args=("$@")
    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"
4

3 回答 3

0

这 [[:space:]] 可能有用吗?

于 2013-03-27T10:20:31.917 回答
0

尝试在表达式周围加上单引号。

pattern_params="-e 's/^[^#]*${pattern}.*$/#&\n${pattern} ${option}/g' $pattern_params"
于 2013-03-27T05:18:00.550 回答
0

我有一个解决方法,不是将所有参数组合成一个,而是为每个参数一个接一个地运行 sed 命令。它工作正常。但是我仍然想知道如何将参数组合成一个。

sed_chain() {
    args=("$@")
    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


}
于 2013-03-27T10:08:42.133 回答