我当前有一个字符串:
https://drive.google.com/file/d/j2903r293rj092j3r20/view?usp=sharing
我想从中提取j2903r293rj092j3r20
。我在Mac操作系统中使用标准的perl安装。我有
URL="https://drive.google.com/file/d/j2903r293rj092j3r20/view?usp=sharing"
echo $URL | perl -pe 's/https://drive.google.com/file/d///g' | perl -pe 's//view?usp=sharing//g'
其中我将perl应用到前面和后面。有没有办法一步到位?感谢
解析URL时,最好使用合适的解析器,如URI
use strict;
use warnings;
use URI;
my $uri = URI->new("https://drive.google.com/file/d/j2903r293rj092j3r20/view?usp=sharing");
my @path = $uri->path_segments;
print $path[-2];
此打印:
j2903r293rj092j3r20
我想,如果你需要这个在一个班轮,它会是类似于:
perl -MURI -lne'$u = URI->new($_); print (( $u->path_segments )[-2])'
当然。
首先,在这里使用替换运算符(s/.../.../
(是错误的工具。您可以使用匹配运算符(m/.../
(来提取所需字符串的位。
echo $URL | perl -pe 'm/https://drive.google.com/file/d/(w+)/ and $_ = $1'
在这里,我们使用";捕获圆括号";以复制字符串";单词字符";(字母数字和下划线(,将URL中/d/
后面的值转换为变量$1
。然后,我们将其复制到$_
中,因为这是-p
将自动打印的变量。
但我们可以做得更好。s/.../.../
和m/.../
都允许我们更改分隔符,这样我们就不必转义所有这些斜杠。
echo $URL | perl -pe 'm[https://drive.google.com/file/d/(w+)] and $_ = $1'
我们可以直接使用print
来去除结尾处略显混乱的变量赋值。
echo $URL | perl -ne 'print m[https://drive.google.com/file/d/(w+)]'
而且,如果我们知道我们的输入数据总是看起来像当前的示例,那么就真的没有必要包含那么多URL。
echo $URL | perl -ne 'print m[/d/(w+)]'
更新:您收到一条注释,建议您使用URI模块解析字符串。我不相信这特别有用,因为模块会给你URL的路径部分,你仍然需要提取正确的路径部分。但是,为了完整起见,这里有一个使用该模块的示例:
echo $URL | perl -MURI -ne 'print +(URI->new($_)->path_segments)[3]'
我们根据输入创建一个URI对象,并立即调用其path_segments()
方法来获取路径的分段。我们打印返回的列表的第四个元素。
既然你用macos标记了这个问题,我想像这样的简单sed
命令没有错
echo "$s" | sed -n 's,.*/d/([^/]*).*,1,p'
匹配/d/
及以下的所有字符,捕获下一个字符,直到第一个/
或字符串结束,然后匹配其余字符。替换为第一组的内容,只打印该值。
您只需将逗号分隔的两部分放在一个perl-pe命令中即可:
echo $URL | perl -pe 's/https://drive.google.com/file/d///g','s//view?usp=sharing//g'