【发布时间】:2011-12-07 04:28:10
【问题描述】:
我在尝试替换一个网址时遇到错误?替换给定目录中所有文件中的 URL 的有效方法是什么。
sed: -e expression #1, char 62: unknown option to `s'
find . -name '*' | xargs sed -i 's/old_url/new_url/g' 不起作用
【问题讨论】:
我在尝试替换一个网址时遇到错误?替换给定目录中所有文件中的 URL 的有效方法是什么。
sed: -e expression #1, char 62: unknown option to `s'
find . -name '*' | xargs sed -i 's/old_url/new_url/g' 不起作用
【问题讨论】:
或者在你原来的问题中使用find:
find . -type f -exec perl -pi -e 's{old_url}{new_url}g' {} +
如果 Perl 告诉你“没有这样的文件或目录”,那可能是因为你不小心遗漏了 -e
编辑:将 s///gs 更改为 s{}{}g,因为正如 TLP 指出的那样,您正在使用 URL。
编辑:根据 ikegami 的建议将 \; 更改为 +。
【讨论】:
\; 更改为+ 以避免启动太多perl 实例。 (需要 GNU find。)
find 命令,我从未听说过。 (可能是因为我主要使用 Solaris 工作?)
find 的Solaris 手册页,就在那里,就像白天一样。与往常一样,RTFM...
这是一种在 perl 中实现的方法。
cd directory
perl -pi -e 's!old_url!new_url!g;' *
【讨论】:
s/// 使用另一个分隔符可能是个好主意。
-e
-i 后面的字符用作(可选)备份文件的扩展名。例如。 -i.bak 创建 file.bak。因此,您不能在 -i 选项之后立即添加其他标志。
根本问题可能是您指定了类似
s/http://example.com/ick/poo/http://example.net/also/not/
这不是一个有效的sed 或perl 脚本,而且显然很模棱两可。使用在正则表达式或替换中都不存在的替代分隔符;一个流行的选择是!
s!http://example.com/ick/poo!http://example.net/also/not!
在sed 和perl 中均有效。
编辑感谢@TLP 在评论中也诊断出此问题。如果您发布类似的答案,我将删除此答案。
【讨论】: