it-swarm.com.de

Wie ersetze ich mehrere Zeilen durch ein einzelnes Wort in der Datei (Inplace Replace)?

Der Inhalt meiner filename -Datei sieht beispielsweise wie folgt aus:

My block of line starts from here 
START
First line
second line
third line
END
and end to here for example.

Ich möchte einen Zeilenblock zwischen START und END durch nur ein Wort ersetzen, zum Beispiel durch SINGLEWORD. Wie unten:

My block of line starts from here 
SINGLEWORD
and end to here for example.

Ich kann meinen Zeilenblock mit diesem Befehl finden:

grep -Pzo "START(.|\n)*END" filename

Und das Ergebnis der Ausführung über Befehl wird so aussehen:

START
First line
second line
third line
END

Dann habe ich diesen Befehl verwendet, um alle Zeilen in einer einzigen Zeile zu kombinieren:

LAST_RESULT | sed -e :a -e '/$/N; s/\n/ /; ta'

Dann bekomme ich folgendes Ergebnis:

START First line second line third line END

Und mit meinem letzten Befehl LAST_RESULTS | sed 's/.*/SINGLEWORD/' ändere ich sie auf "SINGLEWORD" und bekomme dieses Ergebnis.

SINGLEWORD

Nun möchte ich: Wie kann ich diesen Befehl (oder Ihren Vorschlagsbefehl) verwenden und meinen Zeilenblock durch "EINWORT" ersetzen? Und das Endergebnis wird wie folgt aussehen:

My block of line starts from here 
SINGLEWORD
and end to here for example.
8
αғsнιη

Dies kann sehr einfach in Perl durchgeführt werden:

$ Perl -i -p0e 's/START.*?END/SINGLEWORD/s' file
$ cat file
My block of line starts from here 
SINGLEWORD
and end to here for example. 

Erklärung

-0 setzt das Zeilentrennzeichen auf null

-p Wenden Sie das von -e angegebene Skript auf jede Zeile an und drucken Sie diese Zeile aus

Der Regexp-Modifikator:

  • /s Zeichenfolge als einzelne Zeile behandeln. Ändern Sie also . so, dass es mit jedem beliebigen Zeichen übereinstimmt, auch mit einer neuen Zeile, die normalerweise nicht übereinstimmt.

Warum der ?:

  • Standardmäßig ist ein quantifiziertes Submuster "gierig", dh es stimmt so oft wie möglich überein (bei gegebener Startposition), während der Rest des Musters übereinstimmt. Wenn Sie möchten, dass die Mindestanzahl der möglichen Übereinstimmungen erreicht wird, folgen Sie dem Quantifizierer mit einem ?.
12
Sylvain Pineau

Ich habe mich gefragt, ob dies ohne Perl, python und andere möglich ist. Und ich habe diese Lösung mit sed gefunden:

$ sed ':a;N;$!ba;s/START.*END/SINGLEWORD/g' filename

Erläuterung:

  1. : a Erstellt eine Bezeichnung 'a'
  2. N füge die nächste Zeile an den Musterraum an
  3. $! wenn nicht die letzte Zeile , ba Zweig (gehe zu) Label 'a'
  4. s ersetzen , /START.*END/ durch SINGLEWORD, /g globale Übereinstimmung (so oft es geht)

Es wurde gefunden hier .

@ KasiyA, danke, ich habe viele interessante Dinge gelernt!

13
c0rp