我想写一个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)'
先谢谢你!
-罗伯
在 grep -oP '(?<="$input_directory")'
,变量 input_directory
因为外面的单引号,所以不会被展开。你可以做一些类似`
grep -oP '(?<='"$input_directory"')'
而不是。