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**TP
wo XXX
könnte RSS
oder SNA
in deinem Beispiel sein.
Wie es funktioniert
join("", <>)
erzeugt einen einzelnen String aus dem Ergebnis descat
Befehlsdass 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\w
für Wörter) und Leerzeichen\s
, einem möglichen~
(0 oder 1 Mal) und dann 3 Wortzeichen (z. B.:RSS
oderSNA
), zwei Sternen\*\*
gefolgt von bestehenTP
.Klammern werden verwendet, um nur das zwischen ihnen eingeschlossene Muster zu erfassen.
/gm
sind Regexp-Modifikatoren, dieg
alle übereinstimmenden Zeichenfolgen zurückgeben (nicht nur die erste) undm
mehrzeilige Suchen ermöglichen.Die
for
Anweisung durchläuft alle Ergebnisse und ruft jede gefundene Übereinstimmung aufs/\s//g && print "$_\n"
.s/\s//g
entfernt alle Leerzeichen (einschließlich Wagenrückläufe) undprint "$_\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 cat
die Datei anzeigen und grep
nur 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