批量替换序列化CDN子域

时间:2014-11-20 22:16:39

标签: batch-file applescript cdn text-processing textwrangler

我们正在移动现有网站以使用img资源的CDN分发。项目经理已经强制要求在每个页面上我们必须将img src分发给六个不同的CDN子域之一 - 这个想法是因为对不同域的下载请求同时执行而不是串行执行,我们将获得速度优势

换句话说,我需要改变这个......

<p>Argle bargle.</p>
<img src="http://old-domain.com/_img/image-a.jpg">
<img src="http://old-domain.com/_img/image-b.jpg">
<img src="http://old-domain.com/_img/image-c.jpg">
<img src="http://old-domain.com/_img/image-d.jpg">
<img src="http://old-domain.com/_img/image-e.jpg">
<img src="http://old-domain.com/_img/image-f.jpg">
<img src="http://old-domain.com/_img/image-g.jpg">
<img src="http://old-domain.com/_img/image-h.jpg">
<p>Whiz bang.</p>

进入这个...

<p>Argle bargle.</p>
<img src="http://cdn1.cdn.com/_img/image-a.jpg">
<img src="http://cdn2.cdn.com/_img/image-b.jpg">
<img src="http://cdn3.cdn.com/_img/image-c.jpg">
<img src="http://cdn4.cdn.com/_img/image-d.jpg">
<img src="http://cdn5.cdn.com/_img/image-e.jpg">
<img src="http://cdn6.cdn.com/_img/image-f.jpg">
<img src="http://cdn1.cdn.com/_img/image-g.jpg">
<img src="http://cdn2.cdn.com/_img/image-h.jpg">
<p>Whiz bang.</p>

我有数百个要更新的文件,它们比上面的示例复杂得多。如果CDN只是一个域,我会使用TextWrangler批量替换所有文件。但我需要以某种方式序列化(甚至随机化?)替换字符串。

我使用FileMaker Pro作为生产前端(自动导航构建,元标记等),因此我尝试在我的HTML输出字段上创建一个计算,它将序列化每个src,但我认为它需要一个for-each循环,你不能在计算字段中做(我有FM Pro,而不是FM Pro Advanced,所以我不能使用自定义函数)。

有人在AppleScript上做过类似的事吗?或者可以利用终端文本处理器?任何建议都将不胜感激。

2 个答案:

答案 0 :(得分:0)

我建议您使用这样的简单bash脚本:

#!/bin/bash

OLD="old-domain.com\/_img"
NEW="cdn1.cdn.com\/_img"
DPATH="/home/of/your/files/*.html"

for f in $DPATH
do
   sed "s/$OLD/$NEW/g" "$f" > temp; mv temp "$f";
done

它会在old-domain.com/_img上的所有cdn1.cdn.com/_img个文件中用.html替换/home/of/your/files/

答案 1 :(得分:0)

您实际上是在从FileMaker编写HTML吗?如果是这种情况,并且您想使用Perform AppleScript操纵HTML,那么您可以执行以下操作。

最佳实践:始终使用&#34; Native AppleScript&#34;而不是&#34;计算AppleScript&#34;。要将数据输入和输出AppleScript,请创建一对全局字段,以便在FileMaker和AppleScript之间进行读写。这有助于您在与其他应用程序交谈时隔离AppleScript错误,以便它们不会流入后续脚本步骤。 (我更喜欢创建一个Global表并创建一个名为@Global的表格。在Global表格中,我创建了两个字段:AppleScriptInputAppleScriptOutput。你必须在这个表中创建一个记录,否则你会发现神秘的#34; AppleScript中找不到对象&#34;错误。)

Set Field [@Global::AppleScriptInput; $myHtml]
Perform AppleScript [“
    -- Read HTML from a global field in FileMaker
    set html to get data (table "@Global")'s (field "AppleScriptInput")

    -- Split html on old domain fragment
    set my text item delimiters to "<img src=\"http://old-domain.com/_img/"
    set html_fragments to text items of html

    -- Prefix resource with CDN domain fragment
    repeat with i from 2 to length of html_fragments
      set cdn_number to (i - 2) mod 6 + 1
      set cdn_fragment to "<img src=\"http://cdn" & cdn_number & ".cdn.com/_img/"
      set item i of html_fragments to cdn_fragment & item i of html_fragments
    end repeat

    -- Re-join html fragments
    set my text item delimiters to ""
    set html to html_fragments as text

    -- Write html back to a global field in FileMaker
    set data (table "@Global")'s (cell "AppleScriptInput") to html
”]
Set Variable [$revisedHtml; @Global::AppleScriptOutput]

上述脚本步骤将读取您从FileMaker变量$html提供的输入,并将您提供的输出保存到$revisedHtml

当然,您可以在纯FileMaker脚本中执行相同的操作:

Set Variable [$html; "<p>Argle bargle.</p>
    <img src=\"http://old-domain.com/_img/image-a.jpg\">
    <img src=\"http://old-domain.com/_img/image-b.jpg\">
    <img src=\"http://old-domain.com/_img/image-c.jpg\">
    <img src=\"http://old-domain.com/_img/image-d.jpg\">
    <img src=\"http://old-domain.com/_img/image-e.jpg\">
    <img src=\"http://old-domain.com/_img/image-f.jpg\">
    <img src=\"http://old-domain.com/_img/image-g.jpg\">
    <img src=\"http://old-domain.com/_img/image-h.jpg\">
    <p>Whiz bang.</p>"
    ]
Set Variable [$oldDomain; "http://old-domain.com/_img/"]
Set Variable [$itemCount; PatternCount ( $html ; $oldDomain )]
Loop
    Exit Loop If [Let ( $i = $i + 1 ; If ( $i > $itemCount ; Let ( $i = "" ; True ) ) )]
    Set Variable [$html; 
        Let ( [
          domainPosition = Position ( $html ; "http://old-domain.com/_img/" ; 1 ; 1 );
          domainLength = Length ( "http://old-domain.com/_img/" );
          cdnNumber = Mod ( $i - 1 ; 6 ) + 1
        ] ;
          Replace ( $html ; domainPosition ; domainLength ; "http://cdn" & cdnNumber & ".cdn.com/_img/" )
        )
    ]
End Loop
Show Custom Dialog ["Result"; $html]