265

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

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

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

我收到每个文件的错误:

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

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

4

6 回答 6

662

如果您在 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/" {} \;

看到这个

于 2013-10-18T19:02:18.507 回答
54

您只是忘记向-i. 只需更改-i-i ''.

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

于 2014-10-02T08:54:03.903 回答
48

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

brew install gnu-sed

然后使用 gsed 而不是 sed,这将按预期工作。

于 2020-03-06T10:30:32.440 回答
4

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

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

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

于 2020-09-09T10:11:41.810 回答
2

可能您的新域包含//如果是这样,请尝试使用in以外的分隔符sed,例如#,

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

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

于 2013-10-18T18:29:27.227 回答
1
于 2022-03-02T18:24:14.970 回答