【问题标题】:Replacing string with variable in bash when variable starts with special characters当变量以特殊字符开头时,用bash中的变量替换字符串
【发布时间】:2018-04-04 07:05:37
【问题描述】:

使用 sed 将字符串替换为变量的内容,方法是用双引号 (") 而不是单引号 (') 将搜索表达式括起来。

$ astring="Liftoff in [sec]"
$ for s in 3 2 1; do echo $astring | sed -e "s/\[sec\]/$s/"; done
Liftoff in 3
Liftoff in 2
Liftoff in 1

但是,如果变量内容以特殊字符开头,我该如何进行上述替换?例如,变量内容可以以句点正斜杠 (./) 开头,如果本地文件路径作为变量传递,这通常是这种情况?

for s in ./3 ./2 ./1; do echo $astring | sed -e "s/\[sec\]/$s/"; done
sed: -e expression #1, char 14: unknown option to `s'
sed: -e expression #1, char 14: unknown option to `s'
sed: -e expression #1, char 14: unknown option to `s'

【问题讨论】:

  • 问题出在:s 不应该包含替换值;它需要包含将进行所需替换的sed 脚本的一部分。您没有将变量传递给sed;你动态生成一个sed 脚本。

标签: bash variables sed replace


【解决方案1】:

你只需要使用另一个分隔符:

for s in ./3 ./2 ./1; do echo "$s" | sed -e "s|\[sec\]|$s|"; done

避免与您的输入冲突

【讨论】:

  • 感谢您的快速回答。
【解决方案2】:

对于这个特定的用例,没有必要使用sed,原生 bash 解决方案更简单、更高效、更不繁琐(因为你不需要担心分隔符或其他特殊字符在替换字符串):

$ for s in ./3 ./2 ./1; do echo "${astring/\[sec\]/$s}"; done
Liftoff in ./3
Liftoff in ./2
Liftoff in ./1

请参阅Bash manual 中的 bash 参数扩展语法列表。

【讨论】:

    猜你喜欢
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    • 1970-01-01
    • 2015-03-17
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多