2008-12-06 104 views
2

我已經寫了一個非常簡單的bash腳本來幫助我從dev遷移到staging。它所做的是刪除分段中的所有文件,將文件從dev複製到stage。編寫bash腳本來更改文本並寫入日誌

但是,config.inc.php文件需要將「dev」的第一個實例更改爲「stage」,並且不會更改其他實例。第二,每當我運行它(我從開發目錄運行腳本),我想它寫一個日誌回到開發目錄,這將追加日期/時間戳,我運行的分段bash腳本進入這個日誌。

謝謝。

+0

謝謝,我會嘗試這三個差異,讓大家都知道! – AFG 2008-12-10 06:30:49

+0

注意:這只是將dev的第一個實例更改爲stage,而不是任何其他後續實例.... – AFG 2008-12-10 06:31:51

+0

謝謝,我選擇了Jonathan's - 它更強大,因此可以根據需要更改和修改,也更清晰只有第一例。我主要使用了第1行的解決方案,因爲我不清楚其中的差別,但知道字符串的第一個實例是fa – AFG 2008-12-10 06:43:54

回答

4

這將改變只有「開發」到「舞臺」

的首次亮相
sed -i '0,/dev/ s/dev/stage/' config.inc.php 

請注意,它會將「devel」更改爲「stageel」。這個版本的行爲和你想要的一樣,只搜索一個「dev」,而不是「devel」(實際上,s/\<dev\>/stage/作爲替代表達式應該可以工作,但它似乎沒有按預期工作?如果有人願意,我會很高興更沉渣 - 福可以解釋)

sed -i "/\<dev\>/,/\<dev\>/ s/dev/stage/" config.inc.php 

日誌記錄:

​​

添加人喬納森·萊弗勒

  • 假設解決了其他問題(見下文),則第二個sed命令仍然可以將devel更改爲stagel,如果該行包含例如「將開發代碼從/ some/dev/location移動到/ some/stage/location「。
  • 此外,第二個sed命令將映射在第一行包含dev和第二個這樣的行之間找到的每個dev。如果有多個匹配行,則這很重要,而原始的'0,/dev/'(或修訂的'0,/\<dev\>/')只能根據請求匹配第一行。
  • 原因"s/\<dev\>/stage/"不起作用不是sed問題,而是一個shell問題。使用單引號,你幾乎可以。使用雙引號,反斜槓小於序列看起來爲sed,因爲它只是小於。
  • 經驗法則:在包含正則表達式材質的shell腳本中的任何參數周圍使用單引號。除非它用單引號飽和,否則用正則表達式中的每個單引號替換序列引號,反斜槓,引號,引號「'\''」。 (第一個報價終止單引號字符串;反斜槓報價單引號;最後一個報價重新啓動單引號字符串。)
  • 請注意'-i'選項是一個擴展名爲sed的GNU擴展名;由於問題標記爲Linux,因此使用GNU sed;請注意您是否需要遷移到Solaris,AIX和HP-UX等平臺。
  • 最後,sed不支持擴展正則表達式作爲標準;你必須使用'-r'選項在GNU sed中顯式啓用它們。

據我估計,假設覆蓋是可取的,命令應該是:

sed -i -r '0,/\<dev\>/s/\<dev\>/stage/' config.inc.php 
0

第一部分(編輯文件)可以很好地與流編輯器工具sed來完成:

sed -i -e s/dev/stage/ config.inc.php 

此編輯就地(-i),沒有備份的文件,使用表達式/dev/stage/-e)用另一個替換一個表達。

+0

,它將dev的每個實例都更改爲 – hayalci 2008-12-06 20:09:46

1

在文件中改變一個單詞:

cat config.inc.php | sed 's:dev::stage' > config.inc.php.new 

要追加到一個日誌文件:

echo $timestamp >> mylogfile.log