regex - 将变量作为正则表达式环视的表达式传递
问题描述
我正在尝试编写一个shell脚本,该脚本使用正则表达式环视提取出现在其他两个字符串之间的字符串(尽管如果有更好的方法请告诉我)。我正在搜索的字符串是路径/gdrive/My Drive/Github/gbks/NC_004113.1.gbk
(实际上我有几个这样的字符串),而我要提取的部分是NC_004113.1
(或在另一个类似字符串中的位置)。换句话说,我要提取的部分将始终位于/gdrive/My Drive/Github/gbks/
and两侧.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"')'
反而。
推荐阅读
- authentication - 我的 Salesforce Visualforce 页面不需要身份验证
- php - laravel 使用不同的 php 版本
- c# - 如果应用程序已最小化、在后台或用户空闲,如何停止 WPF 应用程序?
- ruby - Squib DataFrame 上的 If 语句
- javascript - Discord.js v12,潜在的拆分错误,在命令后读取 args 并执行它
- amazon-dynamodb - Dynamoose 中的虚拟字段
- git - 尝试在 Ubuntu 服务器上进行 git pull/push 时出错
- postgresql - 我如何在 gorm 1.20.0 中关闭数据库实例
- python - 使用 Python 将 for 循环结果添加到 Excel 电子表格
- bash - 使用 bash 变量时出现“意外的 $end”