bash regexp提取部分URL

时间:2017-09-28 03:16:20

标签: regex bash sed

来自以下网址:

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"

任何人都可以帮助解决我的错误吗?

2 个答案:

答案 0 :(得分: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/

答案 1 :(得分: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的第一个缓冲区。

//: 现在根据网址\1来提及它们。

(。[^ /] ):* 现在是sed缓冲区的第二部分,其中包含值//,因为REGEX会查找console.developers.google.com的第一次出现并停止在那里匹配。

(。[^ /] )&& (。[^ /] )&& /(.):* 接下来的3次出现与存储缓冲区的方法相同,就像它们会查找/的第一次出现一样,并保留最后匹配字母的值#s下一次发生到第1 /来。

/ \ 5 /: 现在我用/代替所有内容,意味着第5个缓冲区,其中包含根据OP指令的值。

相关问题