2016-09-30 77 views
0

我有一些數據,看起來像這樣 "thumbnailUrl": "http://placehold.it/150/adf4e1"如何分離鏈接以獲取shell中的URL結尾?

我想知道我怎麼能得到URL後沿部分,我想輸出是 adf4e1

我試圖啓動時到grep以/結尾「,但我只是shell腳本初學者,需要一些幫助。

+0

也許更重要的是,你是如何得到這個字符串的第一個地方?它看起來像一個JSON片段;像'jq'這樣的工具可能更適合從原始數據中直接獲取所需的值。 – chepner

回答

1

我想出了一個快速和骯髒的解決方案,用grep(用Perl的正則表達式)和切:

$ cat file 
    "thumbnailUrl": "http://placehold.it/150/adf4e1" 
    "anotherUrl": "http://stackoverflow.com/questions/3979680" 
    "thumbnailUrl": "http://facebook.com/12f" 
    "randortag": "http://google.com/this/is/how/we/roll/3fk19as1" 

$ cat file | grep -o '/\w*"$' | cut -d'/' -f2- | cut -d'"' -f1 
    adf4e1 
    3979680 
    12f 
    3fk19as1 
+0

使用'cat file | awk -F /'{print $ NF}'' – dganesh2002

+0

'awk'是一種不同的解決方案。 – galfisher

+0

@ dganesh2002爲什麼要用'貓'?並在末尾留下''' – Sundeep

1

我們可以有許多的小cut S,或只是一重擊殺死這個AWK:

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

測試:

$ echo '"thumbnailUrl": "http://placehold.it/150/adf4e1"' \ 
    | awk -F'[/"]' '{ print $(NF-1); }' 
adf4e1 

過濾thorugh Awk使用雙引號和斜線作爲字段分隔符。這意味着尾部../adf4e1"被分隔爲{..}</>{adf4e1}<">{},其中大括號表示字段和尖括號分隔符。 Awk變量NF給出了基於1的字段數,因此$NF是最後一個字段。這不是我們想要的,因爲它是空白的;我們想要$(NF-1):倒數第二個字段。

「Golfed」版本:

awk -F[/\"] '$0=$(NF-1)' 
1

如果原始字符串是從一個較大的JSON對象的到來,使用類似jq提取所需的值。

例如:

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

(第一個命令只是產生表示數據的原始源的有效的JSON對象;第二命令分析它並提取所需的值的split功能拆分網址。一個數組,從中你只關心最後一個元素。)

1

您可以在bash中使用字符串替換和子去除,如果你包裝你的字符串中的單引號,並將其分配給一個變量也這樣做純粹。

#!/bin/bash 

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

adf4e1 #output 
+0

在第二個命令中不需要使用'echo',只需使用'string =「$ {string // \」}「' – Sundeep

+1

謝謝你指出這一點,我已經更新了答案。 –