正则表达式:使用grep从utilite输出中确定信息

时间:2017-06-27 09:52:43

标签: regex grep

utilite nconvert生成有关某个文件的信息:

nconvert -info file.tiff

输出

** NCONVERT v7.00 (c) 1991-2017 Pierre-E Gougelet (Apr 18 2017/09:49:26) **
        Version for Windows NT/9x/2000/Xp/Vista/7  (All rights reserved)
** This is freeware software (for non-commercial use)

Over...

file.tiff : Success
    Format               : TIFF
    Name                 : tiff
    Compression          : CCITT Group 4
    Width                : 3194
    Height               : 5056
    Components per pixel : 1
    Bits per component   : 1
    Depth                : 1
    # colors             : 2
    Color model          : RGB
    Bytes Per Plane      : 400
    Orientation          : Top Left
    Xdpi                 : 600
    Ydpi                 : 600
    Page(s)              : 30
    Info:
      Photometric Interpretation: White=0
      PhotometricInterpretation: 0
      PlanarConfiguration: 1
      SamplesPerPixel: 1
      Software: LIBFORMAT (c) Pierre-e Gougelet
    Metadata             : ( EXIF )

我需要使用grep提取数字信息。假设,我想定义页数,我用

nconvert -info file.tiff | grep -oP "(?<=Page\(s\)).*$"

我明白了:

      : 30

但我只需要号码30

下面的修改也没有带来预期的结果

nconvert -info efile.tiff | grep -oP "(?<=Page\(s\)\s+\:).*$"

如何在冒号后获取信息?

3 个答案:

答案 0 :(得分:1)

您可以使用此grep

nconvert -info efile.tiff | grep -oP 'Page\(s\)\h*:\h*\K\d+'
30

\K会重置匹配的信息。

您还可以使用awk

nconvert -info efile.tiff | awk -F '[: \t]*' '$2=="Page(s)"{print $3}'
30

答案 1 :(得分:1)

您需要在此处使用\K 匹配重置运算符转换正向lookbehind,以在您需要提取的值之前允许可变宽度模式:

grep -oP 'Page\(s\)\s*:\s*\K.*'

在这里,

  • Page\(s\) - 匹配Page(s)
  • \s*:\s* - 匹配用0 +空格包围的:
  • \K - 省略了目前为止匹配的文字
  • .* - 匹配其余部分。

答案 2 :(得分:1)

nconvert -info file.tiff |
sed -n '/^[[:space:]]*Page\(s\)/{s/^[^[:digit:]]*//;p}'

应该这样做。 __

<强>解释

    {li> -n sed限制它将每一行打印到输出。默认情况下,它会打印所有内容。
  • /pattern/是自我解释的,即寻找一个模式,用两个正斜线包围它。
  • /^pattern/在行的开头查找模式
  • /^[[:space:]]*Page\(s\)/在一行开头查找任意数量的空格,后跟Page(s)
  • 如果我们在行中找到上述部分,那么sed将处理大括号{commands}内的命令。
  • 第一个命令是替换格式s/patten/substitution/
  • 正则表达式中的
  • []用于字符范围,例如[A-Z][0-9]
  • 但也可以使用字符类,[:digit:]字符类与0-9相同通过将^放在[]的开头,您可以否定该字符人物类。因此,简而言之s/^[^[:digit:]]*//表示删除开头的任何非数字字符。注意*表示任意zero or more次。
  • 最后的p打印线条。此外,sp命令也不以分号分隔