Ich möchte eine Reihe von Dateien aktualisieren, indem ich eine mehrzeilige Zeichenfolge durch eine andere mehrzeilige Zeichenfolge ersetze. Etwas in der Art von:
* Some text,
* something else
* another thing
Und ich möchte es ersetzen durch:
* This is completely
* different text
Das Ergebnis wäre, dass nach dem Ersetzen die Datei, die den ersten Textblock enthält, jetzt die zweite Zeichenfolge enthält (der Rest der Datei bleibt unverändert).
Ein Teil des Problems ist, dass ich die Liste der zu aktualisierenden Dateien im Dateisystem finden muss. Ich schätze, ich kann grep dafür verwenden (obwohl das wiederum mit mehrzeiligen Zeichenfolgen nicht so einfach ist), um es dann vielleicht in sed zu leiten?
Gibt es eine einfache Möglichkeit, dies zu tun? Sed ist eine Option, aber es ist umständlich, weil ich hinzufügen muss \ n usw. Gibt es eine Möglichkeit zu sagen, "die Eingabe aus dieser Datei zu übernehmen, sie in diesen Dateien abzugleichen und sie dann durch den Inhalt dieser anderen Datei zu ersetzen"? Ich kann bei Bedarf Python verwenden, aber ich möchte etwas schnelles und einfaches. Wenn also ein Dienstprogramm verfügbar ist, würde ich dieses lieber verwenden, als mein eigenes Skript zu schreiben (das ich zu schreiben weiß).
some text, something else another thing
feststellen, ob es sich über mehrere Zeilen erstreckt oder nicht? Oder wollen Sie nur zusammenpassensome text,\nsomething else\nanotherthing
?Antworten:
Ersetzen Sie "Some ... \ n ... Thing" durch den Inhalt der Datei "new" in einer oder mehreren Eingabedateien
-i
um input.txt direkt zu ändern-p0
schlürfen Eingabedatei Datei und drucken Sie es am Endes/regexp/.../s
in regulärem Ausdruck.
ist.|\n
s/.../exp/e
ersetzt durcheval(exp)
s/Some text\n...\n...thing\n/...
quelle
perl -i -p0e ' $b= `cat before`; s/$b/Some thing\n/se' input.txt ...
Ich fürchte, Sie werden es schwer haben, eine Lösung zu finden, die zu Ihnen passt, bis Sie eine konkrete Beschreibung des Problems gefunden haben - aber dafür ist die Qualitätssicherung meines Erachtens am besten geeignet. Vielleicht haben Sie so eine Idee - es werden immer 3 Zeilen gleichzeitig im Musterbereich belassen - mit einem Lookahead von 2 Zeilen - während Sie jeweils nur eine Zeile vorwärts durch die Eingabedatei gleiten.
Es sollte in der Lage sein, mit Ihrer Zeichenfolge übereinzustimmen, unabhängig davon, ob sie mehrere Zeilen umfasst oder nicht - also bis zu drei. Es gibt jedoch keine Bestimmungen zum Spiegeln dieser Bestimmung in der Ersetzung - sie umfasst immer zwei Zeilen, wie geschrieben.
quelle
Nicht zu stark (weil die zweite Saite nicht geprüft wird, sich aber leicht einpendeln lässt) und nicht posix-kompilierbar, sondern sehr einfach:
Der erste Befehl fügt Zeilen aus einem Text hinzu, bis ein anderer Text getroffen wurde , und die zweite Zeile ändert ihn in einen anderen Text.
ANMERKUNG Die Einschränkung besteht darin, dass nach einigen Texten immer etwas anderes folgen muss .
quelle