2012-02-24 121 views
1

我想通過bash腳本替換'jsp'頁面中的一些註釋。sed隨機返回空字符串

我的問題是,隨機地擦除了一些文件,而其他文件則正確替換了文件頭。

腳本:

echo "Processed Files:" > processedFiles.txt 

for f in $(find . -name "*.jsp") 
do 

    #Check if the file contains the doctype 
    htmlPage=`cat $f | grep "<!DOCTYPE HTML PUBLIC \"-\/\/W3C\/\/DTD HTML 4.0 Strict\/\/EN\">"` 
    oldHtmlPage=`cat $f | grep "<!DOCTYPE HTML PUBLIC \"-\/\/W3C\/\/DTD HTML 3.2\/\/EN\">"` 
    if [ ${#htmlPage} -gt 0 ] || [ ${#oldHtmlPage} -gt 0 ] 
    then 
     echo processing $f 

     # if read only, allow us to write on it 
     rdonly=0 
     if [ ! -w "$f" ] 
     then 
      chmod +w "$f" 
      rdonly=1 
     fi 

      # replace headers 
     if [ ${#htmlPage} -gt 0 ] 
     then 
      cat "$f" | sed 's/<!DOCTYPE HTML PUBLIC "-\/\/W3C\/\/DTD HTML 4.0 Strict\/\/EN">/<!DOCTYPE html>/g' > "$f"  
     fi 

     if [ ${#oldHtmlPage} -gt 0 ] 
     then 
      cat "$f" | sed 's/<!DOCTYPE HTML PUBLIC "-\/\/W3C\/\/DTD HTML 3.2\/\/EN\">/ /g' > "$f"  
     fi 

     # add file to list of processed 
     echo $f'\n' >> processedFiles.txt 

     # restore read only 
     if [ $rdonly -eq 1 ] 
     then 
      chmod -w $f 
     fi 
    else 
     # jsp without html doctype declaration 
     echo ignoring $f 
    fi 

done 

當執行在某些情況下,內容是正確的更換sed的命令,但在其他的全部內容被擦除,因此該文件到我注入的代碼變空了。

我認爲,由於包含要被替換的報頭中的如果條件,只有文件進入這個邏輯路徑,我看到擦拭文件和表現爲預期的文件之間沒有差異。

我認爲,如果一個文件不匹配sed的表達該文件將保持不變(在任何情況下擦拭文件似乎包含頭)

什麼可問題是會有什麼想法不勝感激:)

回答

4

這個小片段:

cat "$f" | sed 'something' > "$f" 

是不是真的一個好主意(讀,在寫同一個文件同時)。數據寫入文件可能會干擾讀取。

使用sed -i(就地編輯)可能更安全。

如果您的sed沒有就地編輯,請找到一個有效的編輯。或使用類似:

cat "${f}" | sed 'something' > "${f}-next" 
mv -f "${f}-next" "${f}" 

而且,請,如果你珍惜你的理智,使整個目錄樹的備份運行這些腳本排序之前。

+0

哈哈不用擔心,腳本運行在svn託管的文件夾上,回滾很容易:)而且你是對的,tmp文件+ mv做的伎倆。太感謝了! :P – 2012-02-24 08:48:12