1

目前我正在尝试创建一个 bash 脚本来替换我生成的新值。

这些值存储在constants.php

-----------constant.php : start-------------------
                      :
        define('PASS1', 'ABCD');
        define('PASS2', '1234');
                      :
-----------constant.php : end---------------------

运行脚本后,(使用sedPASS1它应该分别更新和的值PASS 2

-----------constant.php : start-------------------
                      :
        define('PASS1', 'WXYZ');
        define('PASS2', '0987');
                      :
-----------constant.php : end---------------------

有没有办法可以找到 KEY 例如'PASS1'并替换逗号后的值?

4

2 回答 2

3

您可以使用sedso 指定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');
于 2013-01-17T11:49:42.570 回答
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。

于 2013-01-17T11:25:41.837 回答