我的bash脚本中有以下行:
find . -name "*.html" -print |
xargs sed -i 's/http\:\/\/version2\.staging\.myname\.com//g'
并且它给了我以下错误:
sed: 1: "./instant/index. ...": invalid command code .
我要做的是将http://version2.staging.myname.com
替换为/
。你是怎么做到的?
答案 0 :(得分:3)
通常我使用类似的东西:
find . -name "*.html" -exec sed -i 's|http://version2\.staging\.myname\.com/|/|g' '{}' ';'
要对此进行测试,您可以先插入echo
语句
find . -name "*.html" -exec echo sed -i 's|http://version2\.staging\.myname\.com/|/|g' '{}' ';'
...它将告诉您输出是否符合您的预期。在任何批量更新之前,我总是建议先使用echo
进行干运行。此外,您可以使用|
作为备用正则表达式分隔符,以避免在路径中使用尽可能多的“/”。
答案 1 :(得分:2)
对于OSX,请尝试:
find . -name "*.html" -exec sed -i.bak 's#http://version2\.staging\.myname\.com##g' '{}' \; -print
答案 2 :(得分:0)
我认为您可能正在使用Mac(,现在我看到您在iMac上的评论)。在Mac OS X上,sed -i
选项需要参数。这可以理解你的错误信息。 sed
命令将您的s/...//g
命令解释为用于备份文件的后缀;然后它试图将第一个文件名解释为sed
脚本,幸运的是,这不起作用。
此外,您可以使用除/
之外的某些字符作为s///
的分隔符来避免大多数转义问题。此外,通常更好(特别是在文件路径通常最终带有空格的Mac上)以避免xargs
并在-exec
中使用find
以及+
执行xargs
所做的选项 - 即将多个文件名分组到一个命令调用中。
这导致:
find . -name "*.html" -type f \
-exec sed -i .bak -e 's%http://version2.staging.myname.com%%g' {} +
(注意:严格来说,这会将http://version2-staging*myname@com
映射到/
;如果您真的担心这一点,请务必逃避网址中的点。)
如果您想在之后删除.bak
个文件:
find . -name '*.bak' -type f -exec rm -f {} +