Regex 如何使用perl在和向前看和向后看字符串之间提取文本,而无需应用两次?
我目前有一个字符串:Regex 如何使用perl在和向前看和向后看字符串之间提取文本,而无需应用两次?,regex,macos,perl,uri,Regex,Macos,Perl,Uri,我目前有一个字符串: https://drive.google.com/file/d/j2903r293rj092j3r20/view?usp=sharing 我想从中提取j2903r293rj092j3r20。我正在Mac OS中使用标准的perl安装。我有 URL="https://drive.google.com/file/d/j2903r293rj092j3r20/view?usp=sharing" echo $URL | perl -pe 's/https\:\/
https://drive.google.com/file/d/j2903r293rj092j3r20/view?usp=sharing
我想从中提取j2903r293rj092j3r20
。我正在Mac OS中使用标准的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应用于前面和后面。有没有办法一步到位?谢谢您可以在一个perl-pe命令中用逗号分隔两部分:
echo $URL | perl -pe 's/https\:\/\/drive.google.com\/file\/d\///g','s/\/view\?usp=sharing//g'
当然
首先,在这里使用替换运算符(s/../…/
)是错误的工具。您可以使用匹配运算符(m/../
)仅提取所需的字符串位
echo $URL | perl -pe 'm/https\:\/\/drive.google.com\/file\/d\/(\w+)/ and $_ = $1'
这里,我们使用“捕获括号”将URL中/d/
后面的“单词字符”(字母数字和下划线)字符串复制到变量$1
中。然后我们将其复制到$\uu
中,因为这是-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+)]'
更新:您收到一条评论,建议您使用解析字符串。我不认为这是特别有用的,因为模块将为您提供URL的路径部分,您仍然需要提取路径的正确部分。但是,为了完整起见,这里有一个使用该模块的示例:
echo $URL | perl -MURI -ne 'print +(URI->new($_)->path_segments)[3]'
我们从输入中创建一个URI对象,并立即调用它的
path\u segments()
方法来获取路径的段。我们打印返回的列表的第四个元素。解析URL时,最好使用适当的解析器,例如
这张照片是:
j2903r293rj092j3r20
我想如果你需要一行的话,应该是这样的:
perl -MURI -lne'$u = URI->new($_); print (( $u->path_segments )[-2])'
既然您将问题标记为,我想像这样简单的
sed
命令没有什么问题
echo "$s" | sed -n 's,.*/d/\([^/]*\).*,\1,p'
匹配所有小于或等于
/d/
,捕获下一个字符,直到第一个/
或字符串结尾,然后匹配其余字符。替换为第一个组的内容并仅打印该值。可能perl-pe的/*\/([^\/]+)\/.*/$1/'文件
,请参阅。可能这应该通过适当的解析器解决。不要使用正则表达式解析URL。这是一个已解决的问题。使用Perl附带的URI模块。可能是类似的echo'https://drive.google.com/file/d/j2903r293rj092j3r20/view?usp=sharing“| perl-ne'@parts=split'/”;打印$parts[-2]'
--输出j2903r293rj092j3r20
@PolarBearperl-F/-lane'print$F[-2]'
更短。但我认为使用解析器更好。虽然逗号分隔列表确实有效,分号是一种更标准的样式,不太可能让人混淆。
echo "$s" | sed -n 's,.*/d/\([^/]*\).*,\1,p'