ChatGPT解决这个技术问题 Extra ChatGPT

在 OS X 上使用 'sed' 和 'find' 命令时出错:“无效的命令代码。”

被迫为当前客户端使用 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 匹配/替换中的句点,但这并不能解决任何问题。


C
Community

如果您在 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


如果你像我一样花了 10 分钟来发现不同之处,那就是 -e 选项
This question 在 MacOS 上回答 RE error: illegal byte sequence
我使用空字符串 '' 作为 -i 的参数,并且有效,例如 sed -i '' 's/blah/xx/g'
对我来说,在 -i 之后添加 -e 使 sed 以这种方式备份我的所有文件:“foo.txt”-> “foo.txt-e”。显然我想要的是-i '',即不要备份更改的文件。
对我来说同样的问题。此 -i -efind 组合产生了许多以 -e-e-e-e-e-e-e 结尾的文件。
D
Dmitry Mikushin

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

brew install gnu-sed

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


感谢您的回答,这对我很有用!在 Linux 和 Mac 上工作,我更喜欢使用熟悉的工具,而不是学习两个密切相关的工具之间的神秘差异。
谢谢 - 也为我工作。一个不错的小技巧是设置一个像 alias sed='gsed' 这样的别名来完成 macOS 和 linux 之间的对齐。
m
mdup

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

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


M
Moza Man

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

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

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


j
jkshah

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

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

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


R
Ricardo BRGWeb

OP 并非如此,但它适用于我并且可以帮助其他人。

如果您使用 ' 将正则表达式括起来,请仔细检查 ' 字符。我正在从文字处理复制和粘贴脚本,它在 bash 中将 ' 粘贴为


操作系统通常不会做这样的事情。您是否从博客或文字处理器或其他东西复制/粘贴?
@tripleee 你是对的!更新了我的答案。
所以这里真正的教训是永远不要使用文字处理器来编写代码。不幸的是,有些博客平台将“样式化”应用于代码并因此破坏了它,而作为该博客的消费者,您实际上无能为力。
(此外,令人恼火的是,无论您做什么,IOS 上的键盘替换工具都会“有用地”将 ASCII 引号替换为“印刷”引号,因此它不适合保存代码片段。)