我正在尝试编写一个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
答案 0 :(得分:1)
在grep -oP '(?<="$input_directory")'
中,变量input_directory
不会由于外部单引号而扩展。您可以做类似`
grep -oP '(?<='"$input_directory"')'
相反。