【问题标题】:Sed inside bash script not working: But it works on command linebash 脚本中的 Sed 不起作用:但它可以在命令行上运行
【发布时间】:2012-02-08 06:30:03
【问题描述】:

我在命令行上尝试了以下操作并且它们可以工作,但是当我将它们放在 bash 脚本中时出现错误(见下文):

sed -e "s/INSERT_ME_HERE/"${ROOT_BUILD_HOME}"/g" ./Doxyfile > ./tmp && mv ./tmp ./Doxyfile
sed -e "s/INSERT_ME_HERE/'${ROOT_BUILD_HOME}'/g" ./Doxyfile > ./tmp && mv ./tmp ./Doxyfile
sed -e "s/INSERT_ME_HERE/`echo ${ROOT_BUILD_HOME}`/g" ./Doxyfile > ./tmp && mv ./tmp ./Doxyfile

我得到的错误是:

sed: -e expression #1, char 19: unknown option to `s'

但是就像我说的,我是从命令行使用它并且它可以工作:

[mehoggan@hogganz400 Doxygen]$ ROOT_BUILD_HOME=MONKEY; sed -e "s/INSERT_ME_HERE/`echo ${ROOT_BUILD_HOME}`/g" ./Doxyfile | grep MONKEY
INPUT                  = MONKEY

为什么它在一种情况下有效,而在另一种情况下无效?

还设置了 ROOT_BUILD_HOME,我在 shell 脚本中的 sed 表达式之前回显它。

echo `date`: "Going to run doxygen on source and move to ${ROOT_BUILD_HOME}";

【问题讨论】:

  • 附注:不要使用./tmp,您应该尝试mktemp 来执行此类任务,因为它可以提高脚本的安全性和稳健性。

标签: bash scripting sed


【解决方案1】:

我猜ROOT_BUILD_HOME/ 开头,sed 将其解释为替换字符串的结尾。我对吗?如果是这样,请尝试使用不同的分隔符:

sed -e "s#INSERT_ME_HERE#${ROOT_BUILD_HOME}#g" ./Doxyfile > ./tmp && mv ./tmp ./Doxyfile

【讨论】:

  • 先生 +1 为您解决了问题。但是,您还能解释为什么它可以在命令行而不是脚本中工作吗?
  • @Matthew 因为只有当 ROOT_BUILD_HOME 的值包含斜杠时它才会失败。脚本中的值有,但“MONKEY”没有。
  • 你可以转义它\/。或者创建一个 sed 字符串,将 / 替换为 \/ 类似 echo /home/|sed -e 's/\//\\\//g'
【解决方案2】:
#!/bin/bash

ABC=`echo ${ROOT_BUILD_HOME}`
echo $ABC
sed -e 's/INSERT_ME_HERE/'$ABC'/g' <./Doxyfile > ./tmp && mv ./tmp ./Doxyfile

希望对你有帮助

【讨论】:

  • 希望这篇文章能让您更深入地了解为什么它确实适用于脚本 :)
  • 我没有得到你需要的 ABC 变量。如果将前两行替换为echo ${ROOT_BUILD_HOME} 甚至echo $ROOT_BUILD_HOME,会有什么不同?
猜你喜欢
  • 2018-03-25
  • 2013-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-08
  • 2015-11-28
  • 2021-12-14
相关资源
最近更新 更多