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

回避策があります。すべてのパラメーターを 1 つに結合するのではなく、パラメーターごとに sed コマンドを 1 つずつ実行します。それは正常に動作します。ただし、パラメーターを 1 つに結合する方法を知りたいと思っています。

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 に答える
0

式を一重引用符で囲んでみてください。

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

この [[:space:]] はおそらく機能しますか?

于 2013-03-27T10:20:31.917 に答える