使用 sed 更新 .bashrc 中的 PATH 变量

使用 sed 更新 .bashrc 中的 PATH 变量

我一直在尝试将 PATH 变量放入我的 .bashrc 文件中来永久更新它。但是,我不想将其附加到文件中,而是将当前的 PATH=........ 替换为我用于会话的 PATH 变量。这是我到目前为止所拥有的:

sed 's/^PATH=.*/${PATH=$PATH}/' .bashrc > .bashrc

这是我在网上看到的命令的大杂烩,当我运行它时,.bashrc PATH 行被什么都覆盖了。我希望有一个使用 sed 的解决方案,因为我想增加我在过去一个小时中获得的 sed 知识,而不是放弃对 awk 或其他东西的努力。

答案1

第一件事:不要写入您正在读取的文件,您最终可能会删除它。请改用就地编辑功能 ( -i)。

接下来,在硬引号 ( ') 内,变量替换不起作用,因此您需要执行其他操作才能$PATH在其中进行扩展替换。

最后,$PATH很可能包含/字符,这会破坏 的替换语法sed,因此您需要使用另一个分隔符。

假设您的路径从不包含;s,请尝试(当然是在备份当前文件之后):

sed -i 's;^PATH=.*;PATH='"$PATH"';' .bashrc

替换的匹配部分的意思是:匹配以 ( ^)开头PATH=且后跟任意字符 ( .) 的字符串任意次 ( *)。即它将匹配完全开头的行,但不匹配中间某处PATH=的行。PATH=.*很重要,因为您想要替换整行(尝试不使用它,看看会发生什么)。

$PATH考虑到$PATH包含空白字符的情况,在替换中进行替换的引用是必要的。

演示:

$ foo=bar
$ echo hello | sed -e 's/hello/$foo/'
$foo

环境。变量不会在硬引号内替换。所以你$foo在那里得到了一个字面意思。现在让 shell 通过将其从硬引号中取出来扩展它:

$ foo=bar
$ echo hello | sed -e 's/hello/'$foo'/'
bar

好的!但这并不安全:

$ foo="bar baz"
$ echo hello | sed -e 's/hello/'$foo'/'
sed: -e expression #1, char 11: unterminated `s' command

sed在上述之后收到两个参数-es/hello/barbaz/,分别。不好。要解决这个问题,您需要更多的引号:

$ foo="bar baz"
$ echo hello | sed -e 's/hello/'"$foo"'/'
bar baz

"当您将环境变量作为参数传递给其他东西时,您几乎应该总是将环境变量放在引号内,否则(假设$IFS尚未更改)它将在空格上分割。

相关内容