bash - linux如何修改带有斜杠的配置参数值

  显示原文与译文双语对照的内容
129 1

我正在尝试从 .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"

我可以scape这个变量和sed函数一起使用?

这里是 demo.cfg 文件

[params]
key_one = 1
key_two = 9

高级最佳考虑

时间:原作者:0个回答

114 5

尝试像这样传递 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
原作者:
52 0

你有两种选择:

  • 使用不同的分隔符替换,比如 # 或者 _:

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

    这里使用了 Pattern 中不存在的一些内容以便清晰。

  • 或者退出实际的/:

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

    这是不清晰的,因此不推荐。

原作者:
90 4

要转义所选的分隔符,请使用参数扩展:

$ response=/foo/bar
$ response=${response/////}
$ echo"$response"
原作者:
...