首页 > 解决方案 > Shell 脚本 - 删除之前和之后的所有内容

问题描述

如果链接头包含 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 和参数扩展 - 没那么有经验,所以卡住了:)

标签: shell

解决方案


请注意,使用非 html 工具解析 HTML 是充满危险的;你会看到这是可行的,并假设你总是可以摆脱它。当您应该学习如何使用 html-aware 工具时,您将花费数小时尝试使工作更复杂。不要说我们没有警告你(-;,但是

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/可以sed做的事情,awk都可以做同样的事情,但需要使用sub(/regx/, "repl", "str")orgsub(sameArgs)函数。在这种特殊情况下,您可能需要转义<>like \<\>

请务必始终对变量的使用进行 dbl-quote,即echo "$nextReposLink".

IHTH


推荐阅读