无效命令代码,尽管使用转义符,但使用sed


187

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

但是,我希望使用sed命令可以工作:

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

我收到每个文件的错误:

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

我试图逃脱sed比赛/替换中的句点,但这并不能解决任何问题。

Answers:


475

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

看到这个


41
如果您像我确实找到区别那样花了10分钟,则可以使用-e选项
acheron55

9
这个问题回答了RE error: illegal byte sequenceMacOS上的。
JonasVautherin 2014年

11
我使用一个空字符串''作为-i的参数,并且可以正常工作,例如sed -i '' 's/blah/xx/g'
Pierre Houston

25
对于我来说,加入-e-i做出sed备份,这样我的所有文件:“foo.txt的” - >“foo.txt的-E”。显然我想要的是-i '',即不要备份更改的文件。
mdup 2014年

3
对我来说同样的问题。这-i -e与合并find导致结束很多很多文件-e-e-e-e-e-e-e
2014年

39

您只是忘了为提供一个参数-i。只需更改-i为即可-i ''

当然,这意味着您不希望备份文件。否则请提供您的选择范围,例如-i .bak


5

在OS X上,无济于事的内置功能变得不足。解决方案是:

brew install gnu-sed

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


1
感谢您的回答,这对我非常有用!在Linux和Mac上均可使用,我更喜欢使用熟悉的工具,而不是学习两个密切相关的工具之间的神秘差异。
Stephen Shank

3

您的新域可能包含/?如果是这样,请尝试使用分离器比其他/sed,例如#,等等。

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

最好s///用单引号而不是双引号来避免变量替换或任何其他意外行为

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.