Shell脚本-删除之前和之后的所有内容

时间:2020-10-30 17:15:41

标签: shell

如果Link标头包含rel = next,则查找下一个链接。 获取链接头可能导致不同的字符串。我需要找到下一个链接。 例如

Link: <http://mygithub.com/api/v3/organizations/20/repos?page=1>; rel=prev, <http://mygithub.com/api/v3/organizations/20/repos?page=3>; rel=next, <http://mygithub.com/api/v3/organizations/20/repos?page=4>; rel=last, <http://mygithub.com/api/v3/organizations/20/repos?page=1>;

将是http://mygithub.com/api/v3/organizations/20/repos?page=3

Link: <http://mygithub.com/api/v3/organizations/4/repos?page=2>; rel="next", <http://mygithub.com/api/v3/organizations/4/repos?page=2>; rel="last"

将是http://mygithub.com/api/v3/organizations/4/repos?page=2

玩sed和参数扩展-经验不足,所以卡住了:)

2 个答案:

答案 0 :(得分:1)

请注意,使用非HTML工具解析HTML充满了危险;您会看到这可行,并假设您可以永远摆脱它。当您应该研究如何使用可识别html的工具时,您将花费数小时来尝试使工作达到新的高度。不要说我们没有警告过您(-;,但是

printf "<http://mygithub.com/api/v3/organizations/20/repos?page=1>; rel=prev, <http://mygithub.com/api/v3/organizations/20/repos?page=3>; rel=next, <http://mygithub.com/api/v3/organizations/20/repos?page=4>; rel=last, <http://mygithub.com/api/v3/organizations/20/repos?page=1>;\n" \
| awk -F" " '{
    for(i=1;i<=NF;i++){
       if ($i == "rel=next,") {
         gsub(/[<>]/,"",$(i-1);sub(/;$/,"",$(i-1))
         print $(i-1)
       }
    }
}'

产生所需的输出:

http://mygithub.com/api/v3/organizations/20/repos?page=3

要将脚本节的输出保存到变量中,请包装代码以替换命令,在这种情况下

 nextReposLink=$( printf .... | awk '....' )
 #-------------^^--------------------------^

^指向项是命令替换的现代语法。 $( ... )内部的代码被执行,标准输出作为参数传递给调用命令行。 (命令替换的原始语法是/ cmds,在简单的情况下也是如此,即 var =`cmds` 。您可以轻松地嵌套现代cmd替换,而旧版本则需要很多逃脱字符摆弄。如果可以,请避免。

请注意,对于s/str/rep/可以执行的任何sedawk都可以执行,但是需要使用sub(/regx/, "repl", "str")gsub(sameArgs)函数。在这种情况下,您可能需要像<>那样逃避\<\>

请务必始终用双引号括住变量echo "$nextReposLink"的使用。

IHTH

答案 1 :(得分:0)

好吧-我将您的一个URL字符串放入一个文本文件中,并且能够通过两次剪切拉出第一个URL。

[root@oelinux2 ~]# cat test
Link: <http://mygithub.com/api/v3/organizations/20/repos?page=1>; rel=prev, <http://mygithub.com/api/v3/organizations/20/repos?page=3>; rel=next, <http://mygithub.com/api/v3/organizations/20/repos?page=4>; rel=last, <http://mygithub.com/api/v3/organizations/20/repos?page=1>;

然后使用cut:

cat test | cut -d "<" -f2 | cut -d ">" -f1


[root@oelinux2 ~]# cat test | cut -d "<" -f2 | cut -d ">" -f1
http://mygithub.com/api/v3/organizations/20/repos?page=1

这是一个选择-如果您只是想获取字符串中的第一个URL。基本上-这只是抓住两个定界符“ <”和“>”

之间的内容

带切: -d是“定界符” -f是您要获取的字段。

如果您想在该字符串中获取更高的URL,则可以更改字段(-f#)并查看得到的内容:)