我已經寫了一個非常簡單的bash腳本來幫助我從dev遷移到staging。它所做的是刪除分段中的所有文件,將文件從dev複製到stage。編寫bash腳本來更改文本並寫入日誌
但是,config.inc.php文件需要將「dev」的第一個實例更改爲「stage」,並且不會更改其他實例。第二,每當我運行它(我從開發目錄運行腳本),我想它寫一個日誌回到開發目錄,這將追加日期/時間戳,我運行的分段bash腳本進入這個日誌。
謝謝。
我已經寫了一個非常簡單的bash腳本來幫助我從dev遷移到staging。它所做的是刪除分段中的所有文件,將文件從dev複製到stage。編寫bash腳本來更改文本並寫入日誌
但是,config.inc.php文件需要將「dev」的第一個實例更改爲「stage」,並且不會更改其他實例。第二,每當我運行它(我從開發目錄運行腳本),我想它寫一個日誌回到開發目錄,這將追加日期/時間戳,我運行的分段bash腳本進入這個日誌。
謝謝。
這將改變只有「開發」到「舞臺」
的首次亮相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
,因爲它只是小於。'\''
」。 (第一個報價終止單引號字符串;反斜槓報價單引號;最後一個報價重新啓動單引號字符串。)-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
第一部分(編輯文件)可以很好地與流編輯器工具sed
來完成:
sed -i -e s/dev/stage/ config.inc.php
此編輯就地(-i
),沒有備份的文件,使用表達式/dev/stage/
(-e
)用另一個替換一個表達。
,它將dev的每個實例都更改爲 – hayalci 2008-12-06 20:09:46
在文件中改變一個單詞:
cat config.inc.php | sed 's:dev::stage' > config.inc.php.new
要追加到一個日誌文件:
echo $timestamp >> mylogfile.log
謝謝,我會嘗試這三個差異,讓大家都知道! – AFG 2008-12-10 06:30:49
注意:這只是將dev的第一個實例更改爲stage,而不是任何其他後續實例.... – AFG 2008-12-10 06:31:51
謝謝,我選擇了Jonathan's - 它更強大,因此可以根據需要更改和修改,也更清晰只有第一例。我主要使用了第1行的解決方案,因爲我不清楚其中的差別,但知道字符串的第一個實例是fa – AFG 2008-12-10 06:43:54