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

hel*_*on3 162 macos bash 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比赛/替换的时期,但这并没有解决任何问题.

dam*_*ois 416

如果您使用的是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/" {} \;
Run Code Online (Sandbox Code Playgroud)

看到这个.

  • 如果你花了10分钟就像我找到差异一样,那就是-e选项 (30认同)
  • 对我来说,在`-i`之后添加`-e`使`sed`以这种方式备份我的所有文件:"foo.txt" - >"foo.txt -e".显然我想要的是"-i",即不备份已更改的文件. (24认同)
  • 我使用了一个空字符串''作为-i的参数,并且有效,就像`sed -i''s/blah/xx/g' (9认同)
  • [此问题](http://stackoverflow.com/questions/19242275/re-error-illegal-byte-sequence-on-mac-os-x)回答了MacOS上的"RE错误:非法字节序列". (8认同)
  • 对我来说同样的问题.这个`-i -e`与`find`相结合,导致许多文件以`-eeeeeee`结尾. (3认同)
  • @bentael 在 OS X 上使用 [Homebrew](https://brew.sh) 您可以安装 GNU `sed`,它是在 Linux 上安装的那个。 (2认同)

mdu*_*dup 36

你只是忘了提供参数-i.只需-i改为-i ''.

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


Dmi*_*hin 34

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

brew install gnu-sed
Run Code Online (Sandbox Code Playgroud)

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

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

小智 6

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

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

sed 将执行而不会出现错误