2015-11-28 42 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

相關問題