使用'sed'& # 39;发现# 39;在OS X上的命令:“无效的命令代码”;

被迫对当前客户端使用CVS,并且更改了远程回收的地址。在本地代码中更改远程地址的唯一方法是递归搜索和替换。

然而,使用sed命令,我希望工作:

find ./ -type f -exec sed -i "s/192.168.20.1/new.domain.com/" {} \;

我得到一个错误的每个文件:

sed: 1: ".//file/path ...": invalid command code .

我尝试在sed匹配/替换中转义句点,但这并不能解决任何问题。

174864 次浏览

可能你的新域名包含/ ?如果是,尝试在sed中使用除/之外的分隔符,例如#,等。

find ./ -type f -exec sed -i 's#192.168.20.1#new.domain.com#' {} \;

s///括在单引号而不是双引号中也会很好,以避免变量替换或任何其他意外行为

如果您使用的是OS X系统,这可能与sed命令无关。在OSX版本的sed中,-i选项需要一个extension参数,因此您的命令实际上被解析为extension参数,文件路径被解释为命令代码。

尝试显式添加-e参数,并将''作为参数提供给-i:

find ./ -type f -exec sed -i '' -e "s/192.168.20.1/new.domain.com/" {} \;

看到

你只是忘记给-i提供一个参数。只需将-i改为-i ''即可。

当然,这意味着你不希望自己的文件被备份;否则提供你选择的扩展,如-i .bak

在OS X上,没有什么能帮助糟糕的内置功能变得足够。解决方案是:

brew install gnu-sed

然后使用gsed而不是sed,这将像预期的那样工作。

只需向-i标志添加一个扩展。这基本上是用原始文件创建一个备份文件。

sed -i.bakup 's/linenumber/number/' ~/.vimrc

Sed将在没有错误的情况下执行

这不是OP的情况,但对我来说是这样的,可以帮助其他人。

如果你使用'来括住regex,请仔细检查'字符。我从字处理复制和粘贴脚本,它是在bash中粘贴'作为