grep oder andere reguläre Ausdrücke, um den Ausgabewert zu erhalten

694
clarkk

Verwendung grepeines anderen Werkzeugs, um einen bestimmten Wert in einer Ausgabe zu erhalten

In der folgenden Ausgabe muss ich den Wert 255.00in der Zeile mit bekommenMinimum: 255.00 (1.0000)

Ein Muster wie: Channel Statistics:\s+Gray:\s+Minimum: +([\d.]+)

Image: test.tif Format: TIFF (Tagged Image File Format) Geometry: 2525x1785 Class: DirectClass Type: bilevel Depth: 1 bits-per-pixel component Channel Depths: Gray: 1 bits Channel Statistics: Gray: Minimum: 255.00 (1.0000) Maximum: 255.00 (1.0000) Mean: 255.00 (1.0000) Standard Deviation: 0.00 (0.0000) Filesize: 581 Interlace: No Orientation: Unknown Background Color: white Border Color: #DFDFDF Matte Color: #BDBDBD 
0

2 Antworten auf die Frage

0
Toto

Mit Perl können Sie Folgendes tun. Es erfasst den numerischen Wert nach minimum:dem Block Channel Statistics:und druckt ihn:

perl -0 -ne '/Channel Statistics:\s+Gray:\s+Minimum:\h+([\d.]+)/ && print $1,"\n"' file 

Ausgabe: (für gegebenes Beispiel)

255.00 

Erläuterung:

-0 # specifies the input record separator. If there are no digits, the null character is the separator. The whole file is read in a single string. -n # Iterate over the file -e # execute the command line 

Regex:

/ # regex delimiter Channel Statistics: # literally \s+ # 1 or more any kind of spaces Gray: # literally \s+ # 1 or more any kind of spaces Minimum: # literally \h+ # 1 or more horizontal spaces ( # start group 1 [\d.]+ # 1 or more digit or dot ) # end group / # regex delimiter 
0
xenoid

Mit sed

sed -rn 's/^\s+Minimum:\s+([0-9.]+).+$/\1/p' image.data 

In Zeitlupe:

  • -rsagt, sedwir verwenden die erweiterte Regex "Syntax"
  • -nweist sedan, nicht übereinstimmende Zeilen nicht zu drucken
  • s/^\s+Minimum:\s+([0-9.]+).+$/\1/ stimmt mit Ihrer Ziellinie überein und ersetzt sie durch den Wert, nach dem Sie suchen
  • psagt seddas Ergebnis drucken

Wenn Sie den Inhalt der vorherigen Zeilen berücksichtigen müssen, ist dies etwas komplizierter:

sed -r ':a;N;$!ba; s/^.*Gray:\s*\n\s+Minimum:\s+([0-9.]+).+$/\1/' image.data 

woher:

  • :a;N;$!ba;ist eine Schleife in der sedSprache, in der die gesamte Datei gleichzeitig geladen wird
  • -n ist nicht mehr erforderlich, da es keine anderen Zeilen gibt, die wir nicht drucken möchten
  • Das Finale pist auch nicht mehr nötig, da wir es nicht verwenden-n