当变量以特殊字符开头时,用bash中的变量替换字符串

时间:2017-10-23 16:37:27

标签: bash variables sed replace

使用 sed 替换变量内容,并使用double(“)而不是single(')引号括起搜索表达式。

$ 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'

2 个答案:

答案 0 :(得分:1)

您只需使用其他分隔符:

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

避免与您的输入冲突

答案 1 :(得分:0)

对于这个特定用例,不需要使用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参数扩展语法列表。