我期待从cmd输出中获取一个字符串(ID为tmutil destinationinfo
)。
我已使用https://regex101.com/r/aI3yH2/1测试此正则表达式:
/^.*?Name.+?backup02\nKind.+?\nID?\s+:\s([A-Z0-9\-]+)/s
看起来它正在运行,我正在搜索backup01
,backup02
,...
但是如何将ID转移到shell脚本中的变量?
输出是这样的:
====================================================
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
谢谢!
答案 0 :(得分: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 }'