2016-07-04 37 views
0

我正在尝试从.sh文件修改配置文件demo.cfg。我可以使用sed对其进行修改,但问题是该值包含斜线字符。如何用斜杠修改配置参数值

对于我使用这个代码:

read -r -p "(Default PATH: /my/default/path/): " response 
    case $response in 
     (*[![:blank:]]*) sed -i '/key_one/s/= ''.*/= '$response'/' demo.cfg; echo 'OK';; 
     (*) echo 'Using default path' 
    esac 

在这里的错误当变量$response有斜线:

sed: -e expression #1, char 20: unknown option to "s"

我能花葶这个变量与SED功能使用?

这里demo.cfg文件

[params] 
key_one = 1 
key_two = 9 

在先进的感谢 问候

回答

1

尝试通过response这样

${response//\//\\/} 

这将替换所有/\/。例如:

$ response=/my/path/to/target 
$ echo ${response//\//\\/} 
\/my\/path\/to\/target 

您的病例陈述也存在问题。你的bash脚本应该是这样的:

#!/bin/bash 

read -r -p "(Default PATH: /my/default/path/): " response 
    case $response in 
     *[![:blank:]]*) sed -i "/key_one/s/= .*/= ${response//\//\\/}/" demo.cfg 
       echo 'OK' 
       ;; 
     *) echo 'Using default path' 
       ;; 
     esac 
+0

你究竟发布了什么?我更新了答案。 – nautical

+0

我正在使用这个:'echo $ response; sed -i'/ key_one/s/=''。*/='echo $ {response // \ // \\ /}'/'demo。cfg;'但它失败:'坏代换' – oscarvady

+0

'echo'只是为了演示bash中的行为。脚本内部不需要'echo'。只需'$ {response // \ // \\ /}就足够了。 – nautical

0

你有两个选择:

  • 使用不同的分隔符的替代,例如#_

    sed 's#/foo/bar/#/spam/egg#' file.txt 
    

    这里使用的东西是不存在于为清晰起见,模式..

  • 或逃生的实际/

    sed 's/\/foo\/bar\//\/spam\/egg/' file.txt 
    

    这不干净的读取,因此不建议。

+0

为什么第二个选项是不推荐?我无法修改分隔符。 – oscarvady

+0

@oscarvady可读性.. – heemayl

+0

在我的例子中,如何可以逃避变量'$ response'?再次感谢 – oscarvady

0

为了逃避你所选择的分隔符,使用参数扩展:

$ response=/foo/bar 
$ response=${response//\//\\\/} 
$ echo "$response"