Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bash regexp提取URL的一部分_Regex_Bash_Sed - Fatal编程技术网

bash regexp提取URL的一部分

bash regexp提取URL的一部分,regex,bash,sed,Regex,Bash,Sed,从以下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\u 15:23:07.566833\u MPoy/ 我的正则表达式很差。我提出了以下建议,但不起作用: sed -n

从以下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\u 15:23:07.566833\u MPoy/

我的正则表达式很差。我提出了以下建议,但不起作用:

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

有人能帮我解决我做错了什么吗?

使用不同的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/

将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/

使用不同的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/

将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/

请您也尝试一下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
,因为REGEX查找第一次出现的
/
,并停止匹配

(.[^/])&&(.[^/])&&/(:*接下来的3次出现在存储缓冲区的相同方法上,就像它们将查找第一次出现的
/
,并将最后一个匹配字母的下一次出现的值保留到第一次出现为止


/\5/:现在我用
\5
表示第五个缓冲区,根据OP的说明包含值

请您也尝试一下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
,因为REGEX查找第一次出现的
/
,并停止匹配

(.[^/])&&(.[^/])&&/(:*接下来的3次出现在存储缓冲区的相同方法上,就像它们将查找第一次出现的
/
,并将最后一个匹配字母的下一次出现的值保留到第一次出现为止


/\5/:现在我用
\5
表示第五个缓冲区,根据OP的说明包含值

谢谢你helps@AnkitGupta,很高兴它帮助了你,我还补充了解释。如果您有任何疑问,请告诉我。不断学习,不断分享知识,祝你有一个愉快的一天。谢谢helps@AnkitGupta,很高兴它帮助了你,我还补充了解释。如果您有任何疑问,请告诉我。不断学习,不断分享知识,祝你度过愉快的一天。