2015-11-28 30 views
0

我期待从cmd输出(ID为tmutil destinationinfo)得到一个字符串。返回正则表达式结果从cmd输出到变量

我已经测试过此正则表达式与https://regex101.com/r/aI3yH2/1

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

看起来像它的工作,我在寻找backup01backup02,...

但我怎么能抢ID,以一个shell脚本中的变量?

输出是这样的:

==================================================== 
Name   : backup02 
Kind   : Local 
Mount Point : /Volumes/ext_backup01_02 
ID   : BC51C9FA-DE8A-4BA3-B23E-AEC10E9E9F69 
> ================================================== 
Name   : backup01 
Kind   : Network 
URL   : afp://[email protected]/backup01 
Mount Point : /Volumes/backup01 
ID   : 009B3736-61C5-4996-B9BC-A5230BED7961 
==================================================== 
Name   : backup03 
Kind   : Network 
URL   : afp://[email protected]/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 

谢谢!

回答

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 }' 
+0

惊人的回答,非常感谢! – Xairoo

相关问题