我正在尝试提取脚本中响应URL
中返回的一部分。这将在脚本的后期阶段使用。curl
bash
卷曲响应具有以下 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 |
重置比赛的开始(什么是K ept)作为使用后视断言的更短替代方案:环顾四周和正则表达式中对 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 |
重置比赛的开始(什么是K ept)作为使用后视断言的更短替代方案:环顾四周和正则表达式中对 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