[英]Find and Replace Define(Key,Value) in SED Linux
目前我正在嘗試創建一個bash腳本來替換我生成的新值。
這些值存儲在constants.php
:
-----------constant.php : start-------------------
:
define('PASS1', 'ABCD');
define('PASS2', '1234');
:
-----------constant.php : end---------------------
運行腳本后, (使用sed
)它應該分別更新PASS1
和PASS 2
的值:
-----------constant.php : start-------------------
:
define('PASS1', 'WXYZ');
define('PASS2', '0987');
:
-----------constant.php : end---------------------
有沒有辦法可以找到KEY,例如'PASS1'
並替換逗號后的值?
您可以使用sed
指定事件,因此sed "/PASS1/s/'[^']*'/'WXYZ'/2"
匹配包含PASS1
任何行並執行以下替換s/'[^']*'/'WXYZ'/2
其中:
s/ # Substitute
' # Match a single quote
[^']* # Match anything not a single quote
' # Match the closing single quote
/ # Replace with
'WXYZ' # The literal value
/2 # The 2 here matches the second quoted string, not the first.
# First key
$ sed "/PASS1/s/'[^']*'/'WXYZ'/2" file
define('PASS1', 'WXYZ');
define('PASS2', '1234');
# Second key
$ sed "/PASS2/s/'[^']*'/'0978'/2" file
define('PASS1', 'ABCD');
define('PASS2', '0978');
# In one go
$ sed "/PASS1/s/'[^']*'/'WXYZ'/2;/PASS2/s/'[^']*'/'0978'/2" file
define('PASS1', 'WXYZ');
define('PASS2', '0978');
您需要與此類似的替換規則:
/'PASS1'/ s/, *'[^']*'/, 'WXYZ'/
找到包含引用的PASS1的行,並用正確的密碼替換下一個參數。 編寫這樣的規則是單調乏味且容易出錯的,所以我更喜歡讓sed為我編寫它們。 因此,如果文件key-value.txt
包含:
PASS1 WXYZ
PASS2 0987
您可以使用以下命令生成替換規則:
<key-value.txt sed "s:\(.*\) \(.*\):/\1/ s/, *'[^']*'/, '\2'/:"
輸出:
/'PASS1'/ s/, *'[^']*'/, 'WXYZ'/
/'PASS2'/ s/, *'[^']*'/, '0987'/
將此管道插入第二個sed以進行實際更換:
<key-value.txt sed "s:\(.*\) \(.*\):/\1/ s/, *'[^']*'/, '\2'/:" | sed -f - constants.php
使用-i
開關和第二個sed來“就地”更改constants.php。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.