2017-07-13 7 views
1

Hier wird der Text zu ändern:sed regex nicht kompatibel mit PHP Regex

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

Ergebnis erwartet:

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

sed Befehl:

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

Meine regex Arbeit auf https://regex101.com/ ohne Problem , arbeite wie ein Zauber in PHP mit preg_replace, aber nicht mit sed :(

+1

'php' verwendet eine Regex-Variante, die nicht mit' sed' kompatibel ist. Außerdem stimmen Sie mit einer mehrzeiligen Zeichenfolge überein. "Perl" oder "Awk" sind dafür besser geeignet. – anubhava

+1

Danke für Ihre Hilfe @anubhava! Ich habe meine Frage mit der Antwort bearbeitet :) –

+1

@GillesGrandguillaume Lösungen sollten in Antworten, nicht in Fragen eingefügt werden. Du darfst deine eigene Frage beantworten. – Barmar

Antwort

0

Hier die Lösung:

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

Versuch mit awk.

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

Wird die Erklärung in Kürze hinzufügen.

EDIT1: Hinzufügen einer nicht-Liner Form der Lösung erfolgreich auch jetzt.

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