2017-05-08 4 views
3

Ich versuche, eine Konfigurationsdatei mit einem Skript zu bearbeiten, das auch andere Operationen ausführt.Suchen und Ersetzen mehrerer Textzeilen über die Befehlszeile

Das Skript muss bestimmte aufeinanderfolgende Textzeilen finden und diese entfernen. An Ort und Stelle muss eine neue Konfiguration eingefügt werden, die in der gleichen Zeile beginnt wie die alte Konfiguration. Sowohl in der alten als auch in der neuen Konfiguration ist die Verwendung von Leerzeichen wichtig.

in configfile.php dieser Textblock:

'session' => 
    array (
    'save' => 'files', 
), 

muss gefunden und mit Inhalt ich an der gleichen Stelle in replacement.txt setzte ersetzt werden.

Basierend auf Antworten auf ähnliche Fragen, eines der Dinge, habe ich versucht, ist dies:

cat replacement.txt <(sed -i '1,/ 'session' => \n array (\n 'save' => 'files',\n ),/d' configfile.php) > configfile.php 

Dies in einer leeren Datei führt.

cat replacement.txt <(sed -i '1,/ 'session' => \n array (\n 'save' => 'files',\n ),/d' configfile.php) > newfile.php 

Dies macht das gleiche wie Katze replacement.txt> newfile.php ist und ich möchte eine Datei bearbeiten, keine neue Datei erstellen.

Weiß jemand, was mit meiner Syntax falsch ist und wie ich es beheben kann?

Ich habe diese Frage vor here gestellt, aber ich habe mich nicht vollständig verstanden, was ich wollte, also wurde es ein bisschen zu aufwändig und verwirrend. Ich benutze Debian Linux.

bearbeiten basierend auf Kommentar:

Die replacement.txt sieht wie folgt aus:

'session' => 
    array (
    'save' => 'redis', 
    'redis' => 
     array (
      'host' => '127.0.0.1', 
      'other_variable' => 'other_setting', 
     ) 
    ) 
), 

Es ist bereits die Art und Weise eingekerbt es sein sollte und wie eingefügt werden. Die Verwendung von awk oder sed ist in Ordnung.

+1

Danke für Ihre Hilfe. Ich habe die Frage aktualisiert. – phol

+0

Momentan fehlen nur noch die concise-Eingabedatei configfile.php, die die Zeichenfolge anzeigt, die im Kontext zwischen anderen Zeilen ersetzt werden soll, sowie die gewünschte Ausgabe, die dieselbe Datei nach dem Ersetzen anzeigt. –

Antwort

1

Mit GNU awk für Multi-char RS:

$ cat tst.awk 
BEGIN { RS="^$"; ORS="" } 
ARGIND==1 { old = $0 } 
ARGIND==2 { new = $0 } 
ARGIND==3 { 
    if (start = index($0,old)) { 
     $0 = substr($0,1,start-1) new substr($0,start+length(old)) 
    } 
    print 
} 

$ awk -f tst.awk target.txt replacement.txt configfile.php 
    foo 
    'session' => 
    array (
    'save' => 'redis', 
    'redis' => 
     array (
      'host' => '127.0.0.1', 
      'other_variable' => 'other_setting', 
     ) 
    ) 
), 
    bar 

Die oben auf diesen Eingabedateien ausgeführt wurde:

$ cat target.txt 
    'session' => 
    array (
    'save' => 'files', 
), 
$ 
$ cat replacement.txt 
    'session' => 
    array (
    'save' => 'redis', 
    'redis' => 
     array (
      'host' => '127.0.0.1', 
      'other_variable' => 'other_setting', 
     ) 
    ) 
), 
$ 
$ cat configfile.php 
    foo 
    'session' => 
    array (
    'save' => 'files', 
), 
    bar 
$ 

Mit anderen awks würde es sein:

$ cat tst.awk 
FNR==1 { ++argind } 
argind==1 { old = (FNR>1 ? old RS : "") $0 } 
argind==2 { new = (FNR>1 ? new RS : "") $0 } 
argind==3 { rec = (FNR>1 ? rec RS : "") $0 } 
END { 
    if (start = index(rec,old)) { 
     rec = substr(rec,1,start-1) new substr(rec,start+length(old)) 
    } 
    print rec 
} 

$ awk -f tst.awk target.txt replacement.txt configfile.php 
    foo 
    'session' => 
    array (
    'save' => 'redis', 
    'redis' => 
     array (
      'host' => '127.0.0.1', 
      'other_variable' => 'other_setting', 
     ) 
    ) 
), 
    bar 
+1

Vielen Dank für die Hilfe! Indem Sie den Befehl awk mit "> tmp && mv tmp configfile.php" anhängen, wie Sie in meiner vorherigen Frage vorgeschlagen haben, kann ich jetzt in meiner Datei suchen und ersetzen. – phol