2017-07-13 30 views
1

这里的文本改变:SED正则表达式用PHP正则表达式不兼容

'db' => [ 
     'connectionString' => 'mysql:host=localhost;dbname=bob', 
     'emulatePrepare' => true, 
     'username' => 'local', 
     'password' => 'local', 
     'charset' => 'utf8', 
    ], 

结果预计:

'db' => [ 
     'connectionString' => 'mysql:host=localhost;dbname=bob', 
     'emulatePrepare' => true, 
     'username' => 'alice', 
     'password' => 'local', 
     'charset' => 'utf8', 
    ], 

sed命令:

sed -E "s#('db'[ ]*=>[ ]*\[)((\n*?.*?|^\t*.*\n)*)('username'[ ]*=[ ]*>[ ]*)'.*'#\1\2\4'alice'#" textTochange.txt 

https://regex101.com/我的正则表达式的工作没有问题,像preg_replace PHP中的魅力工作,但没有与sed :(

+1

'php'使用与'sed'不兼容的正则表达式。除了你正在匹配一个多行字符串。 'perl'或'awk'更适合这个。 – anubhava

+1

thx为您的帮助@anubhava!我编辑了我的问题与答案:) –

+1

@GillesGrandguillaume解决方案应放在答案,而不是问题。你可以回答你自己的问题。 – Barmar

回答

0

这里变通方法:

perl -0pe "s#('db'[ ]*=>[ ]*\[)((\n*?.*?|^\t*.*\n)*)('username'[ ]*=[ ]*>[ ]*)'.*'#\1\2\4'alice'#m" textTochange.txt 
0

尝试使用awk。

awk -v s1="'" '/db/{A=1} A && /username/{sub(/username.*/,"username" s1 "=> " s1 "alice" s1 ",",$0)} /],/{A=""} 1' Input_file 

也会加上说明。

EDIT1:现在也成功添加了非单线形式的解决方案。

awk -v s1="'" ' 
       /db/{ 
         A=1 
        } 
       A && /username/{ 
           sub(/username.*/,"username" s1 "=> " s1 "alice" s1 ",",$0) 
           } 
       /],/{ 
         A="" 
        } 
       1 
       ' Input_file