如何使用perl在不应用两次的情况下提取"向前看"和"向后看"字符串之间的文本



我当前有一个字符串:

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'

最新更新