sed 中的环境变量替换

新手上路,请多包涵

如果我从脚本运行这些命令:

 #my.sh
PWD=bla
sed 's/xxx/'$PWD'/'
...
$ ./my.sh
xxx
bla

没事。

但是,如果我运行:

 #my.sh
sed 's/xxx/'$PWD'/'
...
$ ./my.sh
$ sed: -e expression #1, char 8: Unknown option to `s'

我在教程中读到,要从 shell 替换环境变量,你需要停止,并“引用” $varname 部分,这样它就不会被直接替换,这就是我所做的,并且只有在变量是在之前定义的。

如何让 sed 将 $var 识别为在 shell 中定义的环境变量?

原文由 RomanM 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

您的两个示例看起来相同,这使得问题难以诊断。潜在问题:

  1. 您可能需要双引号,如 sed 's/xxx/'"$PWD"'/'

  2. $PWD 可能包含斜杠,在这种情况下,您需要找到 $PWD 包含的字符以用作分隔符。

要同时解决这两个问题,也许

sed 's@xxx@'"$PWD"'@'

原文由 Norman Ramsey 发布,翻译遵循 CC BY-SA 3.0 许可协议

除了 Norman Ramsey 的回答之外,我还想补充一点,您可以用双引号括起整个字符串(这可能会使语句更具可读性且不易出错)。

因此,如果要搜索 ‘foo’ 并将其替换为 $BAR 的内容,可以将 sed 命令括在双引号中。

 sed 's/foo/$BAR/g'
sed "s/foo/$BAR/g"

在第一个中,\(BAR 将无法正确扩展,而在第二个中,\)BAR 将正确扩展。

原文由 Jeach 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏