如何从bash脚本中的curl响应中提取部分URL?

如何从bash脚本中的curl响应中提取部分URL?

我正在尝试提取脚本中响应URL中返回的一部分。这将在脚本的后期阶段使用。curlbash

卷曲响应具有以下 URL:

https://www.example.com/1234/text/111?x=999988

现在,我想text/111?x=999988从中提取。另外,我只想将数字存储111在变量中。我正在尝试这样做

#!/bin/bash

sample_link="https://www.example.com/1234/text/111?x=999988"
sample_extract=${sample_link##*/}
echo "$sample_extract"

但这只给了我111?x=999988

谁能告诉我我缺少什么以及如何解决它?

PS:如果缺少任何信息,请告诉我

答案1

GNU grep

$ grep -oP 'https://[^/]+/\d+/\K.*' <<< 'https://www.example.com/1234/text/111?x=999988'
text/111?x=999988

或者

Perl

$ perl -nE 'say $& if m@https://[^/]+/\d+/\K.*@' <<< 'https://www.example.com/1234/text/111?x=999988'a
text/111?x=999988a

正则表达式匹配如下:

节点 解释
https:// 'https://'
[^/]+ 任何字符,除了:/(1 次或多次(匹配尽可能多的数量))
/ /
\d+ 数字 (0-9)(1 次或多次(匹配尽可能多的数量))
/ /
\K 重置比赛的开始(什么是Kept)作为使用后视断言的更短替代方案:环顾四周正则表达式中对 K 的支持
.* 除 \n 之外的任何字符(0 次或多次(匹配尽可能多的数量))

$ grep -oP 'https://[^/]+/\d+/\w+/\K\d+' <<< 'https://www.example.com/1234/text/111?x=999988'
111

或者

$ perl -nE 'say $& if m@https://[^/]+/\d+/\w+/\K\d+' <<< 'https://www.example.com/1234/text/111?x=999988'a
111

正则表达式匹配如下:

节点 解释
https:// 'https://'
[^/]+ 任何字符,除了:/(1 次或多次(匹配尽可能多的数量))
/ /
\d+ 数字 (0-9)(1 次或多次(匹配尽可能多的数量))
/ /
\w+ 单词字符(az、AZ、0-9、_)(1 次或多次(匹配尽可能多的数量))
/ /
\K 重置比赛的开始(什么是Kept)作为使用后视断言的更短替代方案:环顾四周正则表达式中对 K 的支持
\d+ 数字 (0-9)(1 次或多次(匹配尽可能多的数量))

要分配给变量,我想你知道怎么做=)(你原来的帖子展示了如何做)

答案2

您说您想要提取 URL 的一部分,但随后又说您只想将其中的一部分存储在变量中。

提取值的一部分而不对其执行任何操作不会增加任何值,除非您想输出它:

response='https://www.example.com/1234/text/111?x=999988'
echo "tail is $(grep -o '[^/]*/[^/]*?.*' <<<"$response")"

输出

tail is text/111?x=999988    

要将最后一部分放入变量中:

response='https://www.example.com/1234/text/111?x=999988'
last=${response%\?*}
last=${last##*/}
echo "last is $last"

输出

last is 111

相关内容