【问题标题】:return regex result from cmd output to variable将 cmd 输出的正则表达式结果返回到变量
【发布时间】:2015-11-28 00:21:47
【问题描述】:

我期待从 cmd 输出中获取字符串(ID 为 tmutil destinationinfo)。

我已经用https://regex101.com/r/aI3yH2/1 测试了这个正则表达式:

/^.*?Name.+?backup02\nKind.+?\nID?\s+:\s([A-Z0-9\-]+)/s

看起来它正在工作,我正在搜索 backup01backup02、...

但是如何在 shell 脚本中将 ID 获取到变量中?

输出是这样的:

====================================================
Name          : backup02
Kind          : Local
Mount Point   : /Volumes/ext_backup01_02
ID            : BC51C9FA-DE8A-4BA3-B23E-AEC10E9E9F69
> ==================================================
Name          : backup01
Kind          : Network
URL           : afp://username@server02.local/backup01
Mount Point   : /Volumes/backup01
ID            : 009B3736-61C5-4996-B9BC-A5230BED7961
====================================================
Name          : backup03
Kind          : Network
URL           : afp://username@server67.local/backup03
Mount Point   : /Volumes/backup01
ID            : 1E9A3734-33D6-1316-C9B4-B143DA35D9F2

我真的不知道该如何处理。示例代码 100% 不起作用:

#!/bin/bash
ID=$(tmutil destinationinfo | sed -E '/^.*?Name.+?backup02\nKind.+?\nID?\s+:\s([A-Z0-9\-]+)/s')
echo $ID

谢谢!

【问题讨论】:

    标签: regex linux bash shell unix


    【解决方案1】:

    sed(和grep,这将是另一个流行的正则表达式匹配器)是面向行的;他们一次处理一行。所以多行模式行不通。

    你可以获取sed 来累积行数,但不是很漂亮。如果您这样做了,您会发现sed 识别的正则表达式方言与您在在线工具中使用的完全不同。特别是,sed 没有实现非贪婪匹配。

    awk 或许你可以做得更好:

    awk -F '[[:space:]]*:[[:space:]]*' \
        '$1 == "Name" && $2 == "backup02" { this_one = 1 }
         this_one && $1 == "ID" { print $2; exit }'
    

    【讨论】:

      猜你喜欢
      • 2017-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-11
      • 1970-01-01
      • 1970-01-01
      • 2016-03-28
      • 1970-01-01
      相关资源
      最近更新 更多