来自以下网址:
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"
任何人都可以帮助解决我的错误吗?
答案 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指令的值。