Extrahieren Sie alle Übereinstimmungen zwischen einem Wort und der n-ten Zeichenübereinstimmung nach diesem Wort.

Extrahieren Sie alle Übereinstimmungen zwischen einem Wort und der n-ten Zeichenübereinstimmung nach diesem Wort.

Ich habe eine Datei, aus der ich alle Übereinstimmungen extrahieren möchte.

  1. Jede Übereinstimmung beginnt mit einem Wort und endet mit dem n-ten Mal, wenn ein Zeichen nach jeder Übereinstimmung vorkommt, in diesem Fall beim 2. Mal.
  2. Fügen Sie in die Ausgabe das Wort und das n-te übereinstimmende Zeichen ein.
  3. Geben Sie eine Übereinstimmung pro Zeile aus.
  4. In jeder Zeile kann es eine beliebige Anzahl von Übereinstimmungen geben.
  5. Jede Übereinstimmung steht in derselben Zeile, d. h. eine Übereinstimmung wird nicht mit CR, LF oder CRLF auf zwei Zeilen aufgeteilt.

Beispiel: Extrahieren Sie alle Übereinstimmungen zwischen „Benutzer“ und der zweiten Übereinstimmung von „-“ nach jedem „Benutzer“:

Eingabedatei:

sample text user=data-no value /) xx- fdfd\n
abcd

abcd user-- example$% user-%&?@:-useruser**-#<>\"-user0-
gg-
--
useruser------data
user-user------data

Ausgabedatei mit Priorisierung der ersten Übereinstimmung (Wort) und anschließender Vorwärtssuche:

user=data-no value /) xx-
user--
user-%&?@:-
useruser**-#<>\"-
useruser--
user-user-

Ausgabedatei mit Priorisierung der n-ten Übereinstimmung (Wort) am Ende und Rückwärtslesen:

user=data-no value /) xx-
user--
user-%&?@:-
user**-#<>\"-
user--
user-user-

Antwort1

Ich verstehe nicht, was „Priorisierung“ in diesem Zusammenhang bedeutet, aber Sie könnten ein einfaches grep verwenden:

$ grep -Eo 'user([^-]*-){2}' file
user=data-no value /) xx-
user--
user-%&?@:-
useruser**-#<>\"-
useruser--
user-user-

([^-]*-){2}entspricht einer (möglicherweise leeren) Folge von Zeichen ohne Bindestrich, gefolgt von einem Bindestrich, und zwar zweimal.

verwandte Informationen