首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在bash脚本中从regex捕获组

在bash脚本中从regex捕获组
EN

Stack Overflow用户
提问于 2019-03-15 12:25:07
回答 2查看 438关注 0票数 0

当构建一个R包时,该命令将进程步骤输出到std。从该输出中,我想获取包的最终名称。

在下面的模拟脚本中,我显示了build命令的输出。需要捕获的部分是从building开始的最后一行。

如何使regex与这些引号匹配,然后将包名捕获到变量中?

代码语言:javascript
复制
#!/usr/bin/env bash

var=$(cat <<"EOF"
Warning message:
* checking for file ‘./DESCRIPTION’ ... OK
* preparing ‘analysis’:
* checking DESCRIPTION meta-information ... OK
* cleaning src
* checking for LF line-endings in source and make files and shell scripts
* checking for empty or unneeded directories
Removed empty directory ‘analysis/.idea/inspectionProfiles’
Removed empty directory ‘analysis/.idea/snapshots’
* creating default NAMESPACE file
* building ‘analysis_0.1.tar.gz’
EOF
)

regex="building [\u2018](.*?)?[\u2019]"

if [[ "${var}" =~ $regex ]]; then
  pkgname="${BASH_REMATCH[1]}"
  echo "${pkgname}"
else
  echo "sad face"
fi

这应该适用于macOS和CentOS。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-15 19:03:44

在Bash4.2中引入了对\u\U unicode转义的支持。CentOS 7有Bash4.2,因此应该可以在该平台上工作:

代码语言:javascript
复制
regex=$'.*building[[:space:]]+\u2018(.*)\u2019'

不幸的是,早期版本的CentOS有旧版本的Bash,我相信MacOS上的Bash的默认版本仍然是3.2。对于这些人,假设引号被编码为UTF-8,这应该是可行的:

代码语言:javascript
复制
regex=$'.*building[[:space:]]+\xe2\x80\x98(.*)\xe2\x80\x99'

如果引号是在不同平台上以不同的方式编码的,那么您可以使用替换(例如(\xe2\x80\x98|...)而不是xe2\x80\x98)来匹配所有的可能性(并调整用于BASH_REMATCH的索引)。

有关Bash中Unicode的更多信息,请参见How do you echo a 4-digit Unicode character in Bash?

我使用$'...'设置正则表达式,因为它支持\x和(来自Bash4.2的)字符转义,而Bash正则表达式不支持字符转义。

关于正则表达式:

票数 1
EN

Stack Overflow用户

发布于 2019-03-15 12:33:20

做这件事有很多方法,这是一种:

代码语言:javascript
复制
file=`echo "$var" | grep '^\* building' | grep -o '‘.*’' | head -c -4 | tail -c +4`
echo $file
  • 找到以* building开头的行(第一个grep)
  • 查找‘’之间的文本(第二个grep)
  • 丢弃引号(前4个字节和最后4个字节)(头和尾)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55182568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档