将变量作为表达式传递给regex lookaround[重复]。

问题描述 投票:0回答:1

我想写一个shell脚本,使用regex lookaround提取两个其他字符串之间的字符串(尽管请让我知道是否有更好的方法)。/gdrive/My Drive/Github/gbks/NC_004113.1.gbk (实际上我有好几个这样的字符串),而我要提取的部分是 NC_004113.1 或其他类似字符串中的任何东西)。换句话说,我想提取的部分总是在两侧由 /gdrive/My Drive/Github/gbks/.gbk.

我正在研究如何做到这一点,我想用regex lookaround可能会有用。让事情稍微复杂一点的是,字符串本身是存储在一个变量中的。我开始尝试下面的操作,只是想看看它是否能运行,结果确实如此。

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

先谢谢你!

-罗伯

regex shell regex-lookarounds
1个回答
0
投票

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

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

而不是。

© www.soinside.com 2019 - 2024. All rights reserved.