grep-Datei nur für einen Teil der Zeile

9382
mcgrailm

Ich habe eine RTF-Datei, auf die ich grep verwende

 grep "Order Number" 'Extract Text Output.rtf' 

was zu Zeilen führt, die so aussehen

\b\fs28 \cf2 Fab Order Number : FAB00772450\ 

und ich möchte, dass das Ergebnis nur FAB00772450 ist

Ich weiß, wenn ich -o verwende, wird nur das Wort "Bestellnummer" zurückgegeben, aber das hilft mir nicht

2
Ist dies nicht derselbe http://stackoverflow.com/q/974757/422353? vor 12 Jahren 0
Wie zur Hölle ist diese Frage vom Thema ab? Jemand bitte erklären mcgrailm vor 12 Jahren 0
Versuchen Sie, das in den Awk zu leiten, dann können Sie es aufteilen und machen, was Sie möchten. user1200129 vor 12 Jahren 0

3 Antworten auf die Frage

3
TWiStErRob
cat 'Extract Text Output.rtf' | sed -n 's/Order Number : \(.*\)\\/\1/gp' 

Ergibt genau das, was Sie wollen.

Erläuterung:

  • sed -n Standardausgabe von sed unterdrücken
  • s/.../.../g Suchen und Ersetzen, g: alles / global
  • Order Number : \(.*\)\\Suchen Sie nach " Order Number :" String und a backslashund speichern Sie alles in Gruppe 1; (Nachteil der Verwendung von sed ist, dem Gruppierungsoperator von regex zu entgehen: (...)with \(...\))
  • \1 Verwenden Sie Gruppe 1 als Ersatz
  • p Druckersatz, falls eine Übereinstimmung besteht

Dies ist wesentlich flexibler und generischer als die Verwendung von hart codierten Gruppen (7 $).

Hinweis 1: verwenden. *? Wenn Sie Zeilen so formatiert haben:

 \cf2 Fab Order Number : FAB00772450\ \b \cf2 

Dies verhindert, dass Regex gierig wird und stoppt beim ersten Backslash. Nicht getestet, wenn sed unterstützt *? und +? Betreiber, aber hoffen wir.

Hinweis 2: Wenn Sie mehrere Teile aus einer Linie extrahieren möchten, verwenden Sie mehrere Gruppen. In der Ersetzungszeichenfolge können Sie diese sogar mit der Formatierung wechseln, z .../\2 - \1/

2
user1200129

Das funktioniert für mich:

grep "Order Number" test.txt | awk {'print $7'} | tr "\\\ " " " 

Ausgabe:

FAB00772450

Was macht die 7? mcgrailm vor 12 Jahren 0
Ich denke, es druckt die 7. Spalte. Es teilt sich auf Whitespace. user1200129 vor 12 Jahren 0
Es druckt das 7. Feld. Die Aufteilung erfolgt auf dem, was FS ist (Standardeinstellung ist Leerzeichen). Scott C Wilson vor 12 Jahren 1
0
Scott C Wilson

Wenn dieses Format immer verwendet wird, die Anzahl der Token jedoch nicht immer gleich ist, können Sie es durch etwas ähnliches leiten

sed 's /.*: //' | sed 's # \ ##'

Dies ergibt auch "FAB00772450"