Bash 如何分离链接以获取shell中URL的结尾?

Bash 如何分离链接以获取shell中URL的结尾?,bash,shell,grep,Bash,Shell,Grep,我有一些数据看起来像这样 “thumbnailUrl”:http://placehold.it/150/adf4e1“ 我想知道如何获得URL的尾随部分,我希望输出是 adf4e1 当我以/开头,以“但是我只是一个shell脚本的初学者,需要一些帮助”结尾时,我正在尝试grep。你可以在linux中使用“cut”命令来完成。使用“/”进行剪切,并保留最后一次剪切。试试看,这很有趣 请参阅您可以在linux中使用'cut'命令来执行此操作。使用'/'进行剪切并保留最后一次剪切。试试看,很有趣 参考

我有一些数据看起来像这样
“thumbnailUrl”:http://placehold.it/150/adf4e1“

我想知道如何获得URL的尾随部分,我希望输出是
adf4e1


当我以/开头,以“但是我只是一个shell脚本的初学者,需要一些帮助”结尾时,我正在尝试grep。

你可以在linux中使用“cut”命令来完成。使用“/”进行剪切,并保留最后一次剪切。试试看,这很有趣


请参阅您可以在linux中使用'cut'命令来执行此操作。使用'/'进行剪切并保留最后一次剪切。试试看,很有趣


参考

我想出了一个快速而肮脏的解决方案,使用grep(带perl regex)和cut:


我想出了一个快速而肮脏的解决方案,使用grep(带perl regex)和cut:


我们可以用一千个小的
cut
s或者Awk的一次打击来杀死它:

awk -F'[/"]' '{ print $(NF-1); }'
测试:


使用双引号和斜杠作为字段分隔符过滤Awk。这意味着尾部的
。/adf4e1“
被分隔为
{..}{adf4e1}我们可以用一千个
小切口
s或Awk的一次打击来消除这个问题:

awk -F'[/"]' '{ print $(NF-1); }'
测试:


使用双引号和斜杠作为字段分隔符筛选thorugh Awk。这意味着尾随部分
。/adf4e1“
被分隔为
{..}{adf4e1}如果原始字符串来自较大的JSON对象,请使用类似
jq
的方法提取所需的值

例如:

$ jq -n '{thumbnail: "http://placehold.it/150/adf4e1"}' |
> jq -r '.thumbnail|split("/")[-1]'
adf4e1

(第一个命令只生成一个表示原始数据源的有效JSON对象;第二个命令对其进行解析并提取所需的值。
split
函数将URL拆分为一个数组,从中只关心最后一个元素。)

如果原始字符串来自较大的JSON对象,请使用类似于
jq
的方法提取所需的值

例如:

$ jq -n '{thumbnail: "http://placehold.it/150/adf4e1"}' |
> jq -r '.thumbnail|split("/")[-1]'
adf4e1

(第一个命令只生成一个表示原始数据源的有效JSON对象;第二个命令对其进行解析并提取所需的值。
split
函数将URL拆分为一个数组,从中只关心最后一个元素。)

如果将字符串用单引号括起来并将其分配给变量,则也可以在bash中使用字符串替换和子字符串删除来完成此操作

#!/bin/bash

string='"thumbnailUrl": "http://placehold.it/150/adf4e1"'
string="${string//\"}"
echo "${string##*/}"

adf4e1 #output

如果将字符串用单引号括起来并将其分配给变量,则也可以在bash中使用字符串替换和子字符串删除来完成此操作

#!/bin/bash

string='"thumbnailUrl": "http://placehold.it/150/adf4e1"'
string="${string//\"}"
echo "${string##*/}"

adf4e1 #output


如何使用
cut
获取最后一个参数?@galfisher几个选项的备选方案是-awk-F/'{print$NF}“@galfisher
cut-f5-d/
——但是
awk
解决方案更好,因为它可以更宽容地处理一行中的多个分隔符,从而计算字段数,特别是当分隔符是空格时。@gilez这种
cut
解决方案只有在url正好为http://.../../... -这就是
cut
的弱点-不能除非您知道列(或分隔符)的确切数目,否则无法获取最后一列。我同意
awk
是解决此问题的好方法。如何使用
cut
获取最后一个参数?@galfisher几个选项的备选方案是-awk-F/'{print$NF}“@galfisher
cut-f5-d/
——但是
awk
解决方案更好,因为它可以更宽容地处理一行中的多个分隔符,从而计算字段数,特别是当分隔符是空格时。@gilez这种
cut
解决方案只有在url正好为http://.../../... -这就是
cut
的弱点-不能除非知道列(或分隔符)的确切数目,否则无法获取最后一列,我同意
awk
是解决这个问题的好方法。也许更重要的是,您首先是如何获取该字符串的?它看起来像一个JSON片段;像
jq
这样的工具可能更适合直接从原始文件中获取所需的值。也许更重要的是,您是如何从原始文件中获取该字符串的首先?它看起来像一个JSON片段;像
jq
这样的工具可能更适合直接从原始文件中获取所需的值。使用
cat文件| awk-F/{print$NF}
@dganesh2002为什么要使用
cat
?这就留下了一个
”end@galfisher,您使用的正则表达式不使用perl正则表达式,而且当您可以将文件名直接传递给grep时,cat也没有什么用处。。。使用perl正则表达式的grep解决方案可以是
grep-oP'[^/“]+(?=“$)”文件
避免剪切,另一种方法是
grep-oP.*/\K[^”]+'文件
使用
cat文件| awk-F/'{print$NF}
@dganesh2002为什么使用
cat
?并且在end@galfisher,您使用的正则表达式不使用perl正则表达式,而且当您可以将文件名直接传递给grep时,cat也没有什么用处。。。使用perl正则表达式的grep解决方案可以是
grep-oP'[^/“]+(?=“$)”文件
避免剪切替换的需要另一种方法是
grep-oP.*/\K[^”]+'文件
无需在第二个命令中使用
echo
。只需在第二个命令中使用
string=“${string/\\”
无需使用
echo
。。只需使用
string=“${string/\”}”