0

我正在使用 Flickr 进行 API 调用,它会返回每张照片的结果,例如:

<photo id="7503362468" owner="59044395@N02" secret="66b94027db" server="8423" farm="9" title="Potluck" ispublic="1" isfriend="0" isfamily="0" />

现在,根据 Flickr 的 URL/API 文档,它们的 URL 的结构是这样的,mstzb 是照片大小的一个字母指示符:

http://farm{farm-id}.staticflickr.com/{server-id}/{id}_{secret}_[mstzb].jpg

所以,我的问题与可以采取每一行的大规模搜索和替换有关,在前面加上http://farm然后基本上只是“填空”其余部分。目标是使用 API 来获取一个安静的 XML,然后我可以将替换器扔到那里并生成一个 URL 列表。我对 sed 有一个简短的熟悉——诚然,它没有向导——但我只是不确定如何按行进行搜索和替换,然后按正确的顺序替换。当然,farm-id 是第一个进入 URL 的字段,并且是 XML 中的第五个字段——我的意思是搜索和替换模式遵循每一行的相同位置。诚然,我刚刚开始使用正则表达式类型的东西,任何帮助都将不胜感激。我还看到以前有人问过这类问题,但他们似乎专注于如何创建 URL 语法而不是 sed 样式的替换。就像我说的,s/unnecessary/necessary- 我只是不确定如何挑选某些引用的字段并将它们移动到预先形成的行中。

编辑:更多信息 - 我正在使用 Flickr 的 API Explorer 来生成这些 XML 文件,并且通常使用 bash 进行编辑。我认为我在这里所追求的更像是一个 bash 脚本,甚至可能是一种(希望是)可执行编程语言。我将赶紧补充一点,尽管我对使用诸如 python 之类的语言确实“有点”熟悉,但除了 bash 脚本之外,我在编写代码方面几乎没有经验。您可以在此处查看 API Explorer:http ://www.flickr.com/services/api/explore/?method=flickr.photos.search

谢谢大家!

4

2 回答 2

0

使用 awk 的三种解决方案:

解决方案 1. 假设每条 xml 记录看起来都像给定的样本,所有字段都完全按照样本的顺序排列:

双引号设置为字段分隔符,然后将所需内容作为输入行中的位置变量访问。

一个文件可以有许多输入记录,所有记录都将在一次执行中转换。

#!/usr/bin/awk -f
#<photo id="7503362468" owner="59044395@N02" secret="66b94027db" server="8423" farm="9" title="Potluck" ispublic="1" isfriend="0" isfamily="0" />
#1          2          3       4            5        6          7        8    9      `10 11     12      13         14 15        16 17        18 19
#http://farm{farm-id}.staticflickr.com/{server-id}/{id}_{secret}_[mstzb].jpg

#usage ./xml2url.awk <file_of_xml_text
BEGIN {FS="\""}
{print "http://farm"$10".staticflickr.com/"$8"/"$2"_"$6"_[mstzb].jpg"}

解决方案 2. 此解决方案假设您可以编辑 xml,替换

<photo

usage echo x|./xml2urlv2.awk

并更换

/>

一无所有。

然后

#!/usr/bin/awk -f
# usage echo x|./xml2urlv2.awk  id="7503362468"  owner="59044395@N02"  secret="66b94027db"  server="8423"  farm="9" title="Potluck" ispublic="1"  isfriend="0"  isfamily="0"
#<photo id="7503362468" owner="59044395@N02" secret="66b94027db" server="8423" farm="9" title="Potluck" ispublic="1" isfriend="0" isfamily="0" />
#http://farm{farm-id}.staticflickr.com/{server-id}/{id}_{secret}_[mstzb].jpg
#
{print "http://farm"farm".staticflickr.com/"server"/"id"_"secret"_[mstzb].jpg"}

成功了。

解决方案 3. 此解决方案无需在脚本中回显任何内容,但需要进行更多编辑。您必须将 -v 放在您关心的每个字段之前。

#!/usr/bin/awk -f
#<photo id="7503362468" owner="59044395@N02" secret="66b94027db" server="8423" farm="9" title="Potluck" ispublic="1" isfriend="0" isfamily="0" />
#http://farm{farm-id}.staticflickr.com/{server-id}/{id}_{secret}_[mstzb].jpg

#usage: ./xml2urlv.awk -v id="7503362468" -v owner="59044395@N02" -v secret="66b94027db" -v server="8423" -v farm="9" -v title="Potluck" -v ispublic="1" -v isfriend="0" -v isfamily="0"  

BEGIN{print "http://farm"farm".staticflickr.com/"server"/"id"_"secret"_[mstzb].jpg"}
### end of script 

如果您是 awk 新手,请记住整个 print 语句必须在一行中。此外,{ 必须与单词 BEGIN 放在一起。

于 2012-07-08T21:48:36.953 回答
0

您可以使用export捕获所有变量,如下所示:

$ export `echo '<photo id="7503362468" owner="59044395@N02" secret="66b94027db" server="8423" farm="9" title="Potluck" ispublic="1" isfriend="0" isfamily="0" />' | sed -n -e 's;";;g'  -e "s;<photo \(.*\) />;\1;p"`
$ echo "http://farm${farm}.staticflickr.com/$server/${id}_${secret}_[mstzb].jpg"
于 2013-05-30T09:00:01.630 回答