【问题标题】:Trying to execute "sed" command but getting "command not found" error尝试执行“sed”命令但出现“找不到命令”错误
【发布时间】:2017-02-17 00:46:41
【问题描述】:

我正在尝试执行以下命令:

`sed 's/49%100%/49%!100%/' /etc/nagios/objects/services.cfg`

但是我收到了这个错误

-bash: ###############################################################################: command not found

如果我尝试在没有反引号的情况下运行它,该命令将起作用。

我尝试了以下方法:

`sed 's/49%100%/49%!100%/' /etc/nagios/objects/services.cfg` 2>&1

`sed 's/49%100%/49%!100%/' /etc/nagios/objects/services.cfg`> /dev/null

但是没有用。

【问题讨论】:

  • 您正在尝试将sed 的输出作为命令运行 - 这是预期的。为什么需要后记号?
  • @codeforester 嗨,我正在尝试在 shell 脚本中执行此操作,所以我要添加反引号。
  • 只有当你想对输出做一些事情时才需要反引号,比如将它存储到一个变量中。
  • 您对sed 脚本周围的反引号所做的是告诉shell 执行sed 命令的输出,就好像它是一个shell 脚本一样。它不是一个 shell 脚本,所以 shell 很快就会不高兴。
  • 好吧,您的代码正在尝试运行修改后的配置,就好像它是由 shell 命令组成的一样。

标签: bash shell sed scripting


【解决方案1】:

您不需要反引号或$() 在这里调用sed,因为您的要求是不要将sed 的输出解释为命令。

如果您打算修改/etc/nagios/objects/services.cfg,您可以这样做:

sed 's/49%100%/49%!100%/' /etc/nagios/objects/services.cfg > /etc/nagios/objects/services.cfg.new

或者,进行就地编辑(当您完全确定您的 sed 表达式是正确的时):

sed -i 's/49%100%/49%!100%/' /etc/nagios/objects/services.cfg

在 macOS 等 BSD 系统上,sed -i 需要一个参数。命令是:

sed -i '' 's/49%100%/49%!100%/' /etc/nagios/objects/services.cfg

有关反引号及其更现代形式的更多信息,请参阅这些帖子$()

【讨论】:

  • sed -i 在 GNU 和 BSD 实现之间存在不兼容的不同——在 BSD 中(包括在 MacOS X 上),带有备份文件名后缀的参数是强制性的,而不是可选的(没有备份文件中,必须在 -i) 之后传递一个空字符串作为单独的参数——因此这里的代码即使跨提供扩展的系统也不能完全移植。
  • -i '',带空格; -i'' 解析与 -i 完全相同,就其传递给的命令而言。
  • -i 提供一个非空参数来保存备份是个不错的主意,以防万一。如果新文件看起来正确,您可以随时删除它。 :)
  • 我的首选方法是sed 's/a/b/' "${file}" > "${file}2" && mv "${file}2" "${file}"(与-i 相同的问题,并且您必须确定${file}2 不存在...在Solaris 10 上学习了没有的习惯一个-i 选项...)
猜你喜欢
  • 2012-02-08
  • 1970-01-01
  • 2019-07-22
  • 2020-10-31
  • 1970-01-01
  • 2011-08-01
  • 2012-03-20
  • 2018-04-23
  • 2013-10-17
相关资源
最近更新 更多