【发布时间】:2014-01-09 14:29:43
【问题描述】:
我正在尝试用 shell 变量实现 sed 替换。到目前为止,我已经将 sed 替换为 '
sed -i -r 's#(export\ PATH=")(.*)#\1/home/USER/bin:~/.local/bin:\2#' ~/.zshrc
但不幸的是,' 并没有像这个答案 https://stackoverflow.com/a/5156322/675100 中所述那样扩展 shell 变量
在尝试使用" 时,我一直遇到括号等问题。我想让这个通用的总是使用whoami 而不是USER
第一次尝试是
sed -i -r "s#\(export\ PATH=\"\)(.*)#\1/home/`whoami`/bin:~/.local/bin:\2#" ~/.zshrc
sed: -e expression #1, char 60: invalid reference \2 on `s' command's RHS
编辑
我试过了
sed -i -r "s#\(export\ PATH=\"\)\(.*\)#\1/home/$(whoami)/bin:~/.local/bin:\2#" ~/.zshrc
逃避第二组,但我得到了类似的错误:
sed: -e expression #1, char 63: invalid reference \2 on `s' command's RHS
【问题讨论】:
-
请注意,只有
$和反引号会导致双引号内出现问题;括号仅在前面有$时才相关,如$(whoami)等。 -
您转义了第一对括号,但没有转义
(.*)周围的第二对括号。这就是为什么没有第二组可以用\2引用的原因。另外,-r是干什么用的?我的sed没有那个…… -
你为什么专门用
/home/USER/bin而不是~/bin? -
@glennjackman 我已经尝试过了,但 zsh 无法正确识别 - 我不知道为什么。