grep oder anderer regulärer Ausdruck, um den Ausgabewert zu erhalten

grep oder anderer regulärer Ausdruck, um den Ausgabewert zu erhalten

So verwenden Sie grepoder ein anderes Tool, um einen bestimmten Wert in einer Ausgabe zu erhalten

In der folgenden Ausgabe muss ich den Wert 255.00in der Zeile mitMinimum: 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

Antwort1

Mit Perl können Sie Folgendes tun. Es erfasst den numerischen Wert minimum:innerhalb des Blocks Channel Statistics:und druckt ihn aus:

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

Regulärer Ausdruck:

/                           # 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

Antwort2

Mitsed

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

In Zeitlupe:

  • -rsagt sed, dass wir die erweiterte Regexp-"Syntax" verwenden
  • -nweist an sed, nicht übereinstimmende Zeilen nicht zu drucken
  • s/^\s+Minimum:\s+([0-9.]+).+$/\1/stimmt mit Ihrer Zielzeile überein und ersetzt sie durch den gewünschten Wert.
  • pweist an, seddas Ergebnis auszudrucken

Wenn Sie zur Disambiguierung den Inhalt der vorherigen Zeilen berücksichtigen müssen, ist es nur geringfügig komplizierter:

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

Wo:

  • :a;N;$!ba;ist eine Schleife in der sedSprache, die die gesamte Datei auf einmal lädt
  • -nist nicht mehr notwendig, da es keine anderen Zeilen gibt, die wir nicht drucken möchten
  • das Finale pist auch nicht mehr notwendig, da wir nicht verwenden-n

Antwort3

Dies ist sehr simpel und geht davon aus, dass die Zeichenfolge „Minimum:“ in Ihrer Eingabe genau einmal vorkommt:

awk '/Minimum:/ {print $2}'

verwandte Informationen