被迫为当前客户端使用 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 匹配/替换中的句点,但这并不能解决任何问题。
如果您在 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。
在 OS X 上,没有什么可以帮助糟糕的内置 sed 变得足够。解决方案是:
brew install gnu-sed
然后使用 gsed 而不是 sed,这将按预期工作。
alias sed='gsed'
这样的别名来完成 macOS 和 linux 之间的对齐。
您只是忘记向 -i
提供参数。只需将 -i
更改为 -i ''
。
当然,这意味着您不希望您的文件被备份;否则提供您选择的扩展,例如 -i .bak
。
只需将扩展名添加到 -i 标志即可。这基本上用原始文件创建了一个备份文件。
sed -i.bakup 's/linenumber/number/' ~/.vimrc
sed 将在没有错误的情况下执行
您的新域可能包含 /
吗?如果是这样,请尝试在 sed
中使用 /
以外的分隔符,例如 #
、,
等。
find ./ -type f -exec sed -i 's#192.168.20.1#new.domain.com#' {} \;
最好将 s///
括在单引号中而不是双引号中,以避免变量替换或任何其他意外行为
OP 并非如此,但它适用于我并且可以帮助其他人。
如果您使用 '
将正则表达式括起来,请仔细检查 '
字符。我正在从文字处理复制和粘贴脚本,它在 bash 中将 '
粘贴为 ’
。
不定期副业成功案例分享
RE error: illegal byte sequence
。sed -i '' 's/blah/xx/g'
-i
之后添加-e
使sed
以这种方式备份我的所有文件:“foo.txt”-> “foo.txt-e”。显然我想要的是-i ''
,即不要备份更改的文件。-i -e
与find
组合产生了许多以-e-e-e-e-e-e-e
结尾的文件。