将变量作为表达式传递给正则表达式

时间:2020-06-10 03:57:08

标签: regex shell regex-lookarounds

我正在尝试编写一个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)'

谢谢!

-Rob

1 个答案:

答案 0 :(得分:1)

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

的操作

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

相反。