bash:从字符串

时间:2015-09-23 16:00:09

标签: string bash url tokenize

所以,我试图从OS X"最喜欢的服务器"中获取信息。 .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&#34之间使用0或5或7的东西时;和"姓名"在那里。

除此之外,我很难解析Plistbuddy print命令的输出,如下所示:

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 } }

因此,每个条目都有两次相同的网址(我不知道为什么同时存在"名称"以及"网址"当您无法实际制作它们时它们可以从Finder支持的任何协议开始,这意味着afp,http,https,smb或vnc。我试图做的第一件事就是将它们分成几部分,并命名为" substring,以便我知道列表中有多少条目,但是当我使用tr时会导致奇怪的行为;它开始削减太多的碎片。

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

1 个答案:

答案 0 :(得分:1)

您可以使用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