sed使用包含空格的字符串中的参数

时间:2013-03-27 05:05:19

标签: regex bash sed

我正在编写我的函数来将文件中的有效选项替换为我的设置。 1.txt就像:

PasswordAuthentication yes
PermitRootLogin yes

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

#PasswordAuthentication yes
PasswordAuthentication no
#PermitRootLogin yes
PermitRootLogin no

sed参数来自函数sed_chain()生成的字符串,如下所示: 问题是如果$ {pattern}和$ {option}之间有空格,那么我得到错误: sed:-e表达式#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"

3 个答案:

答案 0 :(得分:0)

尝试在表达式周围包装单引号。

pattern_params="-e 's/^[^#]*${pattern}.*$/#&\n${pattern} ${option}/g' $pattern_params"

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


}

答案 2 :(得分:0)

这样做   [[:空间:]] 也许有用?