sed命令出现“替换命令中的错误标志”错误提示。

73

我想运行一个简单的命令,将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,这可能不是你实际输入的内容。请粘贴实际脚本。 - Barmar
是的,真的,只是使用了一个更短的等效方式 :). 我已经更新到完整版本。 - Sergei Basharov
你的引用存在问题,导致文件名被包含在替换命令中,但我在你引用的内容中没有看到它。不过,你缺少一个反斜杠。 - Barmar
2
你报告的错误可能是因为在文件名之前加了 -e,或者在开头缺少了 s/\fonts 命令。它把文件名当作 sed 指令来处理。 - Barmar
我已经阅读了有关sed的man手册。上面写着,在-i后面应该使用用于创建备份文件的扩展名。如果提供空字符串,则不会创建备份。因此,我将其设置为-i'',它可以正常工作。 - Sergei Basharov
可能是重复的问题:sed命令在Mac上失败,但在Linux上可以工作 - Barmar
4个回答

95
在你的命令中,s/\/fonts/../fonts/被视为-i选项的参数(用于备份文件的后缀),而文件名参数则被视为编辑命令。你需要指定禁用备份文件的创建:
sed -i '' ...

在您的例子中:
sed -i '' 's/\/fonts/../fonts/' /Users/sergeybasharov/WebstormProjects/snap/compiled/Content/stylesheets/style.css

电脑很“笨”,它们不会通过上下文理解事情,所以它们无法判断以s/开头的内容显然是编辑命令而非后缀。


1
+1,有趣,我在Windows上没有这个问题,我必须始终使用双引号。 - Endoro
1
@Endoro 在这种情况下,引号的类型并不重要,重要的是你必须在那里有一个明确的参数。 - Barmar
12
也许在OSX的sed中,GNU sed的-i选项可以不带参数使用。好知道 :) - Endoro
1
@purpletech 请参考 https://dev59.com/Om855IYBdhLWcg3wm1q3 - Barmar
你真是个明星,Barmar!在Mac上,这就是你需要的。谢谢! - F1Linux

43

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


8
完全忘记了sed可以使用不同的定界符。这解决了我的问题,因为我的替换内容包含斜杠。太棒了! - TryTryAgain
1
谢谢!我在我的替换中也有斜杠。 - theeagle

24

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

为此,请使用端口安装 gsed(如果没有,请到 http://www.macports.org/ 获取),方法是运行 sudo port install gsed。然后,您可以运行:

gsed -i 's/old_pattern/new_pattern/g' *

17
如果使用Homebrew,等效的命令是brew install gnu-sed - rich
1
使用 gsed 很顺利。我在 Mac 上使用 brew install gsed 安装了 gsed。 - Bhaskar Reddy

9

在 sed 中你可以使用任何字符来分隔字符串,在我的情况下,由于一个字符串中包含了 /,所以出现了错误,因此我需要用 | 替换 sed 分隔符;希望这能帮助其他人。

STRING1="something/somethingelse"
STRING2="clean"

sed -i '' "s|${STRING1}|${STRING2}|g" FILE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接