最近更新: 2007-04-20

檔案插入指定字串(Find 與檔案操作)

日前為了掌握公司網站內容的使用狀況,以公司帳號申請了 Google Analytics 服務 (See also: 部落格小玩意5: 加入 Google Analytics 分析程式碼)。接著就要將 Google 提供的 Analytics 程式碼植入網站的網頁中。然而公司網站早期係以靜態網頁形式建置,每個網站下包含子目錄,擁有數十個靜態頁面內容。若以人工作業方式植入甚為不便。故以 Ruby 撰寫一個小程式,掃描指定目錄之下的所有網頁內容,將 Google Analytics 程式碼植入不含 Analytics 程式碼的網頁中。

#usage: inser_ga_code.rb  GA_ID  dir
require 'Find'

gaID = ARGV[0]
gaCode = %Q{
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "#{gaID}";
urchinTracker();
</script>
}

dir = ARGV[1]
Find.find(dir) do |filepath|
#%w[c:/index.htm c:/index2.html].each do |filepath|  #for test
    next if FileTest.directory? filepath
    next if File.extname(filepath).scan(/\.html?$/i).empty?
    puts filepath

    File.open(filepath, 'rb+') do |fh|
        content = fh.read
        if Regexp.new(%Q(_uacct = "#{gaID}")) =~ content then
            puts 'ok'
        else
            i = content.rindex /<\/body>/i
            next unless i
            fh.pos = i
            fh.print gaCode, content[i..content.length]
            #fh.rewind
            #newContent = content[0...i] + gaCode + content[i..content.length]
            #File.open('index.htm.new', 'w') {|nfh| nfh << newContent}
            puts 'add'
        end
    end
end

筆記

  • Ruby 的 one-liner 執行方式似乎不會深入到子目錄中。
  • ARGV 陣列之內容不含程式檔名。若未傳遞任何引數時,ARGV.length 為 0。這點與C/C++,PHP等不同。在C/C++,PHP之中,argv 陣列的第一個元素為程式檔名,故其 argv 陣列之長度最小為1。
  • 在 Windows 平台上,檔案開啟模式若不為 binary mode ,將影嚮 pos, seek 等方法的定位準確度。
樂多舊網址: http://blog.roodo.com/rocksaying/archives/3031499.html