首页 > 解决方案 > 将变量作为正则表达式环视的表达式传递

问题描述

我正在尝试编写一个shell脚本,该脚本使用正则表达式环视提取出现在其他两个字符串之间的字符串(尽管如果有更好的方法请告诉我)。我正在搜索的字符串是路径/gdrive/My Drive/Github/gbks/NC_004113.1.gbk(实际上我有几个这样的字符串),而我要提取的部分是NC_004113.1(或在另一个类似字符串中的位置)。换句话说,我要提取的部分将始终位于/gdrive/My Drive/Github/gbks/and两侧.gbk

我正在研究如何做到这一点,我认为正则表达式环视可能会起作用。稍微复杂一点的是,字符串本身存储在一个变量中。我开始尝试以下方法,只是为了看看它是否会运行,它确实做到了:

input_directory="/gdrive/My Drive/Github/gbks/"
echo "/gdrive/My Drive/Github/gbks/NC_004113.1.gbk" | grep -oP "$input_directory"/.*

但是,当我尝试用环视做同样的事情时,命令失败了:

input_directory="/gdrive/My Drive/Github/gbks/"
echo "/gdrive/My Drive/Github/gbks/NC_004113.1.gbk" | grep -oP '(?<="$input_directory")'

作为健全性检查,我尝试将字符串直接作为表达式传递,但它仅在我省略引号时才有效,如下所示:

input_directory="/gdrive/My Drive/Github/gbks/"
echo "/gdrive/My Drive/Github/gbks/NC_004113.1.gbk" | grep -oP '(?=/gdrive/My Drive/Github/gbks/)'

这一行实际上给了我想要的输出(虽然我需要修改它,所以我将字符串作为变量传递):

echo "/gdrive/My Drive/Github/gbks/NC_004113.1.gbk" | grep -oP '(?<=/gdrive/My Drive/Github/gbks/).*(?=.gbk)'

最终,我认为代码应该类似于:

input_directory="/gdrive/My Drive/Github/gbks/"
echo "/gdrive/My Drive/Github/gbks/NC_004113.1.gbk" | grep -oP '(?<="$input_directory").*(?=.gbk)'

提前致谢!

-抢

标签: regexshellregex-lookarounds

解决方案


在中,由于外部单引号grep -oP '(?<="$input_directory")',变量input_directory不会被扩展。你可以做类似`

grep -oP '(?<='"$input_directory"')'

反而。


推荐阅读