目前我正在尝试创建一个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'
并替换逗号后面的值?
答案 0 :(得分:3)
您可以使用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');
答案 1 :(得分:0)
您需要与此类似的替换规则:
/'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。