刚被我的sed脚本砸了 - 为什么?

时间:2010-11-22 18:42:25

标签: macos bash sed

根据我收到的here的有用答案,我创建了以下脚本,将其命名为convert_image_paths.command,将其放在我的mac上的网站文件夹中,然后双击它。

#!/bin/bash

# This script will operate on valid relative image paths at this level and one sub-level down, across .html and .css files.

find . -name "*.css" -o -name "*.html" -exec sed -i '' 's/\.\.\/images\//images\//g' {} ';'
find . -name "*.css" -o -name "*.html" -exec sed -i '' 's/images\//http:\/\/mycdn\.com\/images\//g' {} ';'

不幸的是,不是将网站中的相对图像路径更改为新的cdn网址,而是

  1. 将网址加倍:http://mycdn.com/http://mycdn.com/images/myimage.png
  2. 为我机器上的每个html / css文件做了那个
  3. 所以我的问题是a)是否有moron的标签和b)如何修复此脚本?

    修改

    让我澄清一下我的意图: 我想将更改应用于具有相对URL的所有图像路径

      

    “图像/ {myimagepath}”

      

    “../图像/ {myimagepath}”

3 个答案:

答案 0 :(得分:4)

回答你的第二个问题:

b)不要“找到”。当你不知道脚本从哪个目录开始时。如果您希望它从特定目录开始,请在find命令中告诉它:find /Users/ptomblin/Shared/ ...

至于为什么它将网址加倍,这是因为你告诉了它。

sed -i '' 's/images\//http:\/\/mycdn\.com\/images\//g' {}

使用“images /”这个单词的每个实例并将其更改为“http://mycdn.com/images/”,即使它已经以“http://mycdn.com/”开头。如果这不是您想要的,那么您将需要更加具体地了解您的正则表达式。

作为第一次尝试,我会用以下

替换BOTH行
find /Users/ptomblin/Shared -name "*.css" -o -name "*.html" -exec sed -i '' 's@".{0,2}/?images@"http://mycdn.com/images@g' {}

如果以双引号开头,则只会替换images../images

答案 1 :(得分:1)

find .表示“在当前目录中查找” - 所以请确保从要在所有内容中进行此替换的目录中运行此命令,或者更改脚本以获取参数:

#!/bin/bash
if [ $# -lt 1 ]; then
    echo "usage: myscript <path>"
fi

find "$@" ...

我猜测为什么事情变得加倍只是因为它被运行了两次;您原始脚本中的第二个替换将显示“http://mycdn.com/images”并再次替换图像!这是结合两个替换并同时解决该问题的明显方法:

sed -i 's@"\(\.\./\|\)images/@"http://mycdn.com/images/@g'

与开放引号匹配,以确保在已经存在http:// ...时不替换,并且可选择匹配../之后。

我肯定建议在单个文件上调用此方法进行测试,结果打印到stdout而不是编辑到位:

sed 's@...@...@' <file>

答案 2 :(得分:1)

我还想出了为什么我的原始脚本无法识别它的当前目录。在mac上,如果使用.command扩展名命名脚本文件,则它将变为双击。但是,当您通过双击而不是从命令行执行它时,会将其工作目录更改为用户主目录!

myscript.command:

echo "pwd = `pwd`"

./ myscript.command: pwd =当前目录

myscript.command双击: pwd =用户主目录