Wie kann ich in Linux bestimmte Zeichenfolgen extrahieren?

Wie kann ich in Linux bestimmte Zeichenfolgen extrahieren?

Ich bin ein Neuling in Bash und hatte Schwierigkeiten damit, den bestimmten String in meine folgende Datei zu bekommen:

  DS*SC*S45WG*X56558*2
  NE*823*2*SC*q345w45*DT*RTD*7530SRT
  RJTROIT**20140617
  SNA**TP*55
  DS*SC*S45WG*X56558*2
  NE*17*2*SC*211*DT*DFS*75304KSRTRSHT**20140617
  RSS**TP*55
  DS*SC*S45WG*X56558*2
  NE*18*1*SC*3435*DT*PR*753SLRT
  JSRT**20140617~RSS**TP*55
  DS*SC*S45WG*X56558*1
  NE*19*1*SC*ERS*DT*DFS*753048SRY
  TSERY4654**20140617~RSS**TP*60
  DS*SC*S45WG*X56558*1
  NE*19*1*SC*FRAE*DT*ESS*753048499RYTSR**20140722
  RSS**TP*140
  DS*SC*S45WG*X56558*1
  NE*73*46464
  SD**15769
  SNA*PUI*000015769

Mit der oben angegebenen Datei möchte ich die folgenden Daten/Werte erhalten:

7530SRTRJTROIT
75304KSRTRSHT
753SLRTJSRT
753048SRYTSERY4654
753048499RYTSR

(die neben NE*823*2*SC*q345w45*DT*RTD zum Beispiel). Danke!

Antwort1

Da die Werte, die Sie interessieren, auf mehrere Zeilen aufgeteilt zu sein scheinen, würde ich mich auf einen reinen Perl-Regex verlassen, um die richtigen Muster zu finden:

cat file.txt | perl -e 's/\s//g && print "$_\n" for join("", <>) =~ /\*([\w\s]+)[~]{0,1}\w{3}\*\*TP/gm'

Hinweis: Ich bin davon ausgegangen, dass die gesuchten Werte mit diesem Trennzeichen enden:

XXX**TPwo XXXkönnte RSSoder SNAin deinem Beispiel sein.

Wie es funktioniert

  • join("", <>)erzeugt einen einzelnen String aus dem Ergebnis des catBefehls
  • dass ich zum Parsen (des =~Operators) mit diesem regulären Ausdruck verwende:

    /\*([\w\s]+)[~]{0,1}\w{3}\*\*TP/gm

    Dieser reguläre Ausdruck sucht nach Zeichenfolgen, die mit einem Stern beginnen \*und aus [A-Za-z0-9_] Zeichen (Kurzform \wfür Wörter) und Leerzeichen \s, einem möglichen ~(0 oder 1 Mal) und dann 3 Wortzeichen (z. B.: RSSoder SNA), zwei Sternen \*\*gefolgt von bestehen TP.

    Klammern werden verwendet, um nur das zwischen ihnen eingeschlossene Muster zu erfassen.

    /gmsind Regexp-Modifikatoren, die galle übereinstimmenden Zeichenfolgen zurückgeben (nicht nur die erste) und mmehrzeilige Suchen ermöglichen.

  • Die forAnweisung durchläuft alle Ergebnisse und ruft jede gefundene Übereinstimmung auf s/\s//g && print "$_\n".

    s/\s//gentfernt alle Leerzeichen (einschließlich Wagenrückläufe) und print "$_\n"gibt das Endergebnis aus ( $_das ist der aktuelle Wert in der For-Schleife)

Es gibt mir die erwarteten Werte (ohne sie im Befehl fest zu codieren):

7530SRTRJTROIT
75304KSRTRSHT
753SLRTJSRT
753048SRYTSERY4654
753048499RYTSR

Aktualisieren: (um das Datumsmuster einzuschließen)

Bitte verwenden Sie nun folgenden Befehl:

cat file.txt | perl -e 'for$a(join("", <>)=~/\*([A-Z0-9\s]+?)\*\*\d{8}/g){$a=~s/\s+//g;print"$a\n"}'

Antwort2

Sie können catdie Datei anzeigen und grepnur die Zeilen mit den gewünschten Werten abrufen.

z.B:cat myfile | grep 7530SRTRJTROIT

oder um mehrere Werte zu erhalten, können Sie Folgendes verwenden egrep, das reguläre Ausdrücke zulässt:
egrep "7530SRTRJTROIT|75304KSRTRSHT|753SLRTJSRT|753048SRYTSERY4654|753048499RYTSR" myfile

verwandte Informationen