无效的命令代码。,尽管使用sed转义周期

时间:2013-10-18 18:22:21

标签: bash macos sed

强制将CVS用于当前客户端并更改远程仓库的地址。我能找到更改本地代码中远程地址的唯一方法是递归搜索和替换。

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

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

我收到每个文件的错误:

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

我试图逃脱sed匹配/替换中的句号,但这并没有解决任何问题。

5 个答案:

答案 0 :(得分:360)

如果您使用的是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/" {} \;

this

答案 1 :(得分:33)

您只是忘了向-i提供参数。只需将-i更改为-i ''

当然,这意味着您不希望备份文件;否则请提供您选择的扩展程序,例如-i .bak

答案 2 :(得分:15)

在OS X上,无济于事的内置sed变得足够了。解决方案是:

brew install gnu-sed

然后使用gsed代替sed,它将按预期工作。

答案 3 :(得分:0)

您的新域名可能包含/?如果是,请尝试使用/sed以外的分隔符,例如#,等。

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

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

答案 4 :(得分:0)

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

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

sed将执行而没有错误