将变量作为正则表达式环视的表达式传递

Pass variable as expression for regex lookaround

我正在尝试编写一个 shell 脚本,该脚本使用正则表达式查找提取出现在两个其他字符串之间的字符串(尽管如果有更好的方法请告诉我)。 我正在搜索的字符串是路径 /gdrive/My Drive/Github/gbks/NC_004113.1.gbk (实际上我有几个这样的字符串),我想提取的部分是 NC_004113.1 (或者在另一个类似的位置细绳)。换句话说,我要提取的部分将始终位于 /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"/.*

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

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)'

提前致谢!

-罗伯

grep -oP '(?<="$input_directory")'中,变量input_directory不会因为外面的单引号而展开。你可以做类似 `

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

相反。