Wie verwende ich sed / grep, um Text zwischen zwei Wörtern zu extrahieren?
Ich versuche die Ausgabe einer Zeichenfolge, die enthält alles, was zwischen zwei Wörtern eines Strings:
Eingang:
"Here is a String"
Ausgabe:
"is a"
Mit:
sed -n '/Here/,/String/p'
umfasst die Endpunkte, aber ich will nicht, Sie sind.
InformationsquelleAutor der Frage user1190650 | 2012-11-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
InformationsquelleAutor der Antwort Brian Campbell
Einfaches grep unterstützt auch positive & negative look-ahead - & Blick-zurück:
Für deinen Fall würde der Befehl sein:
InformationsquelleAutor der Antwort anishsane
Können Sie strip strings in Bash allein:
Und wenn Sie ein GNU-grep enthält PCREdie Sie verwenden können, eine null-Breite assertion:
InformationsquelleAutor der Antwort ghoti
Akzeptiert die Antwort nicht entfernen von text, der sein könnte, bevor
Here
oder nachString
. Dies wird:Der Hauptunterschied ist die Zugabe von
.*
unmittelbar vorHere
und nachString
.InformationsquelleAutor der Antwort wheeler
Durch GNU awk,
grep mit
-P
(die perl-regexp -) parameter unterstützt\K
die hilft, das verwerfen der zuvor übereinstimmenden Zeichen. In unserem Fall , die zuvor abgestimmt string warHere
so wurde es verworfen aus der letzten Ausgabe.Wenn Sie möchten, dass die Ausgabe
is a
dann könnten Sie versuchen, die untenInformationsquelleAutor der Antwort Avinash Raj
Wenn Sie eine längere Datei mit vielen multi-line vorkommen, ist es sinnvoll, zunächst den Druck Anzahl Zeilen:
InformationsquelleAutor der Antwort alemol
Könnte dies für Sie arbeiten (GNU sed):
Diese stellt jede Darstellung von text zwischen zwei Markierungen (in diesem Fall
Here
undString
) auf eine neue Zeile und bewahrt Zeilenumbrüche innerhalb des Textes.InformationsquelleAutor der Antwort potong
Alle oben genannten Lösungen haben Mängel, wo die Letzte Suche-string wiederholt sich an anderer Stelle in der Zeichenfolge. Ich fand es am besten zu schreiben, eine bash-Funktion.
InformationsquelleAutor der Antwort Gary Dean
Können Sie
\1
(siehe http://www.grymoire.com/Unix/Sed.html#uh-4):Den Inhalt, der innerhalb der Klammern werden so gespeichert, wie Sie
\1
.InformationsquelleAutor der Antwort mvairavan
Problem. Meine gespeicherten Claws Mail-Nachrichten verpackt sind wie folgt, und ich bin versucht, extrahieren Sie die Betreff-Zeilen:
Pro A2 in diesem thread, Wie verwenden von sed/grep extrahieren von text zwischen zwei Wörtern? der erste Ausdruck,, unten "funktioniert", solange der übereinstimmende text nicht enthalten ist ein Zeilenumbruch:
Jedoch, trotz des Versuchs, die Vielzahl von Varianten (
.+?; /s; ...
), konnte ich nicht bekommen, diese arbeiten:Lösung 1.
Pro Extrahieren von text zwischen zwei strings in verschiedenen Zeilen
gibt
Lösung 2.*
Pro Wie kann ich ersetzen ein newline (\n) mit sed?
ersetzt Zeilenumbrüche durch ein Leerzeichen.
Verkettung, die mit A2 in Wie verwenden von sed/grep extrahieren von text zwischen zwei Wörtern?erhalten wir:
gibt
Dieser Variante entfernt doppelte Leerzeichen:
geben
InformationsquelleAutor der Antwort Victoria Stuart