bash: 从字符串中提取 URL

bash: extract URLs from a string

所以,我试图从 OS X 的 "favorite servers" .plist 中获取信息,以便我可以决定是否要向其中添加某些服务器。可以在此处找到有关如何完成此操作的一些信息:

http://jacobsalmela.com/bash-script-set-favorite-servers-in-connect-to-menu/

这个问题是你不能,例如,只是做

/usr/libexec/Plistbuddy -c "Add favoriteservers:CustomListItems:0:Name string server1.fqdn.com" com.apple.sidebarlists.plist

一遍又一遍,因为 Plistbuddy 不够聪明,无法插入数组。你必须知道数组有多长,然后在它的末尾添加东西,这样当你去添加东西时你已经确定你是否需要在 "CustomListItems" 和 [ 之间使用 0 或 5 或 7 =35=] 上面。

除此之外,我在解析 Plistbuddy 打印命令的输出时遇到了问题,它看起来像这样:

Array { Dict { Name = afp://or-fs-001/vol1 URL = afp://or-fs-001/vol1 } Dict { Name = smb://or-fs-001/vol1 URL = smb://or-fs-001/vol1 } Dict { Name = vnc://or-fs-001/vol1 URL = vnc://or-fs-001/vol1 } Dict { Name = ftp://or-fs-001/vol1 URL = ftp://or-fs-001/vol1 } }

所以每个条目都有两次相同的 URL(我不知道为什么会有 "Name" 和 "URL",但实际上你不能使它们不同) ,它们可能以 Finder 支持的任何协议开头,这意味着 afp、http、https、smb 或 vnc。我要做的第一件事就是用 "Name" 子字符串将它们分成几块,这样我就知道列表中有多少条目,但是当我使用 tr 时会导致奇怪的行为为了那个原因;它开始切出太多碎片。

有没有人有更好的方法来做到这一点?我可以数一数 "Dict" 出现的次数吗?

您可以使用 grep -o 来提取输入中有趣的部分。一个例子:

#!/bin/bash
output='Array { Dict { Name = afp://or-fs-001/vol1 URL = afp://or-fs-001/vol1 } Dict { Name = smb://or-fs-001/vol1 URL = smb://or-fs-001/vol1 } Dict { Name = vnc://or-fs-001/vol1 URL = vnc://or-fs-001/vol1 } Dict { Name = ftp://or-fs-001/vol1 URL = ftp://or-fs-001/vol1 } }'

count=$(echo "$output" | grep -o 'Name =' | wc -l)
names=($(grep -o 'Name = [^ ]\+' <<< "$output" | cut -f3- -d' '))
echo $count = ${#names[@]}
for name in "${names[@]}" ; do
    echo "$name"
done