【问题标题】:sed uses parameter from a string contained spacesed 使用来自字符串包含空间的参数
【发布时间】:2013-03-17 03:28:18
【问题描述】:

我正在编写函数以将文件中的有效选项替换为我的设置。 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: unterminated `s' command

如果它们之间没有空格,则该函数可以工作,但这不是我想要的。

#!/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"

【问题讨论】:

  • $pattern_params 回显什么?
  • 只是为了调试$pattern_params的内容
  • 是的,你去那里做什么?
  • *** -es/^[^#]*PermitRootLogin.*$/#&\nPermitRootLogin no/g -es/^[^#]*PasswordAuthentication.*$/#&\nPasswordAuthentication没有/克***
  • 对不起,我被难住了。

标签: regex bash sed


【解决方案1】:

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

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

【讨论】:

  • 它产生另一个错误:sed: -e expression #1, char 1: unknown command: `''
  • 抱歉,stackoverflow 评论系统正在吃掉你的评论
【解决方案2】:

我有一个解决方法,我没有将所有参数合并为一个,而是为每个参数一个接一个地运行 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


}

【讨论】:

    【解决方案3】:

    这样做 [[:空间:]] 也许工作?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-26
      • 1970-01-01
      • 1970-01-01
      • 2012-06-30
      • 2015-10-04
      • 1970-01-01
      • 2017-12-03
      相关资源
      最近更新 更多