我正在编写我的函数来将文件中的有效选项替换为我的设置。 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"
答案 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)
这样做 [[:空间:]] 也许有用?