shell - 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 和参数扩展 - 没那么有经验,所以卡住了:)
解决方案
请注意,使用非 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
推荐阅读
- r - 两个数据库的模糊匹配和精确匹配
- azure - 在 Azure 体系结构中流动用户身份验证
- django - 如何将参数传递给视图函数
- javascript - CryptoJS:如何取回 JSON 可解析字符串?
- next.js - NextJS、_app、SSG、getInitialProps 与 getStaticProps,我应该如何坚持 DRY?
- android - 带有 React 和 google auth 的 Ionic:idToken 在 android 中被截断
- sql - 使用 SQL 比较 2 个 url 主机名
- javascript - 在 Gatsby 中使用链接标签将样式注入 DOM
- python - Python Openpyxl:如何停止推理或覆盖单元格数据类型
- android - 如何使用设计略有不同的相同自定义视图?