【问题标题】:sed throws 'bad flag in substitute command'sed 抛出“替代命令中的错误标志”
【发布时间】:2013-07-06 06:28:12
【问题描述】:

我想运行一个简单的命令,将绝对路径替换为 CSS 文件中的相对路径,如下所示:

sed -i 's/\/fonts/../fonts/' /Users/sergeybasharov/WebstormProjects/snap/compiled/Content/stylesheets/style.css

它抛出这个

sed: 1: "/Users/sergeybasharov/W ...": bad flag in substitute command: 'b'

这个简单的脚本有什么问题?

【问题讨论】:

  • 您的命令中没有b,它一定不是您实际输入的内容。请粘贴实际脚本。
  • 是的,真的,只是使用了一个更短的等价物:)。我已更新为完整版本。
  • 您的引用存在一些问题,导致文件名包含在替代命令中,但我在您引用的内容中看不到它。不过,您缺少反斜杠。
  • 如果您在文件名之前有-e 或者您在开头缺少s/\fonts 命令,则会发生您报告的错误。它将文件名视为 sed 指令。
  • 我已经阅读了man 的 sed。那里写着,在 -i 之后我应该使用用于制作备份文件的扩展名。如果提供了空字符串,则不会创建备份。所以我把它写成-i '' 并且成功了。

标签: macos command-line sed


【解决方案1】:

sed -i 's/\/fonts/../fonts/' 不是有效的 sed 命令,请尝试 sed -i 's#/fonts#../fonts#'

【讨论】:

  • 完全忘记了你可以在 sed 中使用不同的分隔符。这解决了我的问题,因为我的替换包含斜杠。太棒了!
  • 谢谢!我的替换中也有斜线。
【解决方案2】:

在您的命令中,s/\/fonts/../fonts/ 被用作-i 选项(用于备份文件的后缀)的参数,并且文件名参数被视为编辑命令。

您需要指定禁用备份文件创建:

sed -i '' ...

在你的例子中:

sed -i '' 's/\/fonts/../fonts/' /Users/sergeybasharov/WebstormProjects/snap/compiled/Content/stylesheets/style.css

计算机很笨,它们不会根据上下文来判断事物,因此它们无法判断以 s/ 开头的东西显然是编辑命令,而不是后缀。

【讨论】:

  • +1,有意思,在windows下我没有这个问题,我必须一直用双引号。
  • @Endoro 在这种情况下,引号的类型无关紧要,重要的是您必须在那里有一个明确的参数。
  • 也许在OSX sed 中,在GNU sed -i 中没有参数。很高兴知道:)
【解决方案3】:

我遇到了类似的问题。您可以在 Mac 中安装 GNU 版本的 sed,称为 gsed,并使用标准 Linux 语法使用它。

为此,通过运行 sudo port install gsed 使用端口安装 gsed(如果没有,请在 http://www.macports.org/ 获取)。然后,您可以运行 gsed -i 's/old_pattern/new_pattern/g' *

【讨论】:

  • 如果使用 homebrew 是 brew install gnu-sed 等价
  • gsed 一起工作就像一个魅力。我确实使用brew install gsed 在mac 上安装了gsed
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-28
  • 1970-01-01
  • 2017-09-06
  • 2015-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多