2012-09-15 22 views
1

我想建立一個bash(或其他)腳本,當運行時將搜索它自己的目錄(遞歸地)爲具有html擴展名的文件,並更改他們將特定標籤與其他(特定)文件中的內容之間的所有代碼。Bash腳本從字符串指定的點插入文件中的數據

我這樣做,因爲我需要跨它在將要照顧,後來每一個微小變化的所有頁面導航,所以這個腳本會幫助我剛剛得到的第一個基地,所以我可以改變其餘的。

我特別想用腳本在本地執行此操作,而不是用html或php代碼替換它。

+0

使用某種服務器端包含。比你想要做的更容易和更可預測。 – Brad

+0

導航**將**在每個頁面上進行較小的更改,並且會在本地查看這些文件。任何類型的解決方法,只是包括在那裏的文件是不行的。 – user137369

+0

服務器上的小改動是沒有問題的,但是是的,如果要在本地查看這些更改是非常有意義的,那麼它們一定很好。我可以建議編寫一個腳本來準備好這些文件嗎?正則表達式不能真正可靠地處理HTML(儘管它可能適用於特定的情況),這是一個難題。你至少可以使用標識插入點的自定義標籤嗎?也許HTML註釋'<! - insert here'或者其他東西 – Brad

回答

2

基於本格雷厄姆給予的巨大幫助,以及更多的研究,這裏是我所尋找的答案。

您需要一個文件作爲腳本(replace.sh),另一個作爲替換(replacementFile)以及任何其他數量的將替換應用於它們的文件。

腳本。 replace.sh

#!/bin/bash 
find . -name "*.html" | while read FILE; do 
    sed -i '' '/{{endSTRING}}/r replacementFile 
    /{{startSTRING}}/,/{{endSTRING}}/d' ${FILE} 
done 

就是這樣。雖然有一些額外的點。 replacementFile最後應該有一個空行,否則它將連接到更改文件上的下一行。 -i ''是否提供無備份;如果你想要它們,只需在引號之間放置一些東西,它就會將原始文件與你選擇的任何東西一起復制。

3

這應該讓你開始。它會直接編輯這些文件,因此請備份或暫時刪除--in-place開關。創建以下四個文件:

  1. replace.sh:

    #!/bin/bash 
    find -name '*.html' | while read FILE; do 
         sed --in-place -f replace.sed "$FILE" 
    done 
    
  2. replace.sed:

    /{{NAV}}/{ 
        r replacement 
        d 
    } 
    
  3. 更換:

    <ul> 
        <li>Here</li> 
        <li>There</li> 
    </ul> 
    
  4. file.html

    <html> 
    <head></head> 
    <body> 
        <nav> 
          {{NAV}} 
        </nav> 
        <h1>Welcome to Whatever!</h1> 
    </body> 
    

replace.sh可執行文件(chmod a+x replace.sh)。通過運行replace.sh和檢查的file.html

$ ./replace.sh && cat file.html 
<html> 
<head></head> 
<body> 
<nav> 
<ul> 
<li>Here</li> 
<li>There</li> 
</ul> 
</nav> 
<h1>Welcome to Whatever!</h1> 
</body> 

重要的是,佔位符{{NAV}}是在自己的行,因爲sed腳本會抹殺該行的內容的內容進行測試。如果「{{NAV}}」出於某種原因可能出現在您的文件中,則應更改佔位符。

+0

試圖編輯你的* find *命令來包含要搜索的目錄爲「。」(OSX給我一個錯誤,它不存在),但是「編輯至少需要六個字符」。 – user137369

+0

它似乎工作得很好,這幾乎是我想要的,只是一個細節缺失。如何編輯* replace.sed *,以便替換兩個字符串之間的文本?比如說,在{{startNAV}}和{{endNAV}}之間。 – user137369

+0

您可以用'/.* {{startNAV}}。* {{endNAV}}。* /'替換replace.sed的正則表達式部分。但是這仍然會刪除整行。我假設你是否在你的文件中插入佔位符,那麼讓他們在自己的路線上是沒有問題的。如果您不使用佔位符,並且不打算使用已存在於文件中的HTML標記交換正則表達式中的「{{startNAV}}」,這不是一個好主意。請參閱http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 –

相關問題