2017-09-28 118 views
0

的一部分,從以下網址:bash的正則表達式提取URL

https://console.developers.google.com/storage/browser/test-lab-acteghe53j0sf-jrf3f8u8p12n4/2017-09-27_15:23:07.566833_MPoy/]

我需要提取以下部分:

test-lab-acteghe53j0sf-jrf3f8u8p12n4/2017-09-27_15:23:07.566833_MPoy/

我很糟糕的正則表達式。我想出了以下,但它不起作用:

sed -n "s/^.*browser\(test-lab.*/.*/\).*$/\1/p" 

任何人都可以幫助我做錯了什麼?

回答

1

你可以請用awk解決方案嘗試,並讓我知道如果這可以幫助你。

echo "https://console.developers.google.com/storage/browser/test-lab-acteghe53j0sf-jrf3f8u8p12n4/2017-09-27_15:23:07.566833_MPoy/" | awk '{sub(/.*browser\//,"");sub(/\/$/,"");print}' 

說明:簡單地說,替代一切直到browser/然後最後/用NULL代替。

EDIT1:也在這裏添加sed解決方案。

sed 's/\(.[^//]*\)\/\/\(.[^/]*\)\(.[^/]*\)\(.[^/]*\)\/\(.*\)/\5/' Input_file 

輸出如下。

test-lab-acteghe53j0sf-jrf3f8u8p12n4/2017-09-27_15:23:07.566833_MPoy/ 

說明SED命令:將整個線成零件,並使用sed中的,以保持匹配的正則表達式到內存的能力所以這裏我使用的分隔。

([^ //]):*這將有可貴的https:在它,如果有人想將其打印出來,你可以使用\1它,因爲這是第一個緩衝區的sed。

//:現在按URL //談到現在不談。

([^ /]):*既然說到了sed的緩衝區,將它具有價值console.developers.google.com第二部分,因爲正則表達式查找的/非常首次出現,並停止匹配存在本身。

([^ /])& &([^ /] )& & /(。):*這些接下來的3次出現的存儲緩衝區的方法相同,例如他們將查找/的第一個匹配項,並將最後匹配的字母的下一個匹配項的值保留到第1個/到來。

/\ 5 /:現在我代替一切與\5指含有值每個操作的說明第5緩衝。

+1

謝謝這有助於 –

+0

@AnkitGupta,很高興它幫助你,我也加了解釋。讓我知道你是否有任何疑問。不斷學習,不斷分享知識,祝你有個美好的一天。 – RavinderSingh13

1

使用不同的sed分隔符,不要忘記逃離大括號。

avinash:~/Desktop$ echo 'https://console.developers.google.com/storage/browser/test-lab-acteghe53j0sf-jrf3f8u8p12n4/2017-09-27_15:23:07.566833_MPoy/]' | sed 's~.*/browser/\([^/]*/[^/]*/\).*~\1~' 
test-lab-acteghe53j0sf-jrf3f8u8p12n4/2017-09-27_15:23:07.566833_MPoy/ 

OR

使用grep與oP參數。

avinash:~/Desktop$ echo 'https://console.developers.google.com/storage/browser/test-lab-acteghe53j0sf-jrf3f8u8p12n4/2017-09-27_15:23:07.566833_MPoy/]' | grep -oP '/browser/\K[^/]*/[^/]*/' 
test-lab-acteghe53j0sf-jrf3f8u8p12n4/2017-09-27_15:23:07.566833_MPoy/