前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >linux shell:提取正则表达式捕获组(catch group)匹配的字符串

linux shell:提取正则表达式捕获组(catch group)匹配的字符串

作者头像
10km
发布2021-12-04 15:47:18
4.3K0
发布2021-12-04 15:47:18
举报
文章被收录于专栏:10km的专栏10km的专栏

bash

目前大部分shell(如bash)都提供了正则表达式判断操作符=~,如下就可以对一个字符符判断是否匹配正则表达式:

代码语言:javascript
复制
$ [[ "hello world" =~ wor(ld)? ]] && echo match
matched

其实基于上面的表达式不仅可以判断是否匹配正则表达,还可以通过上面表达式创建的变量 BASH_REGEX(数组)提取捕获组(catch group), 如下提取一个url的protocol和host部分

代码语言:javascript
复制
$ [[ "http://www.baidu.com" =~ (https?)://([[:alnum:]]+(\.[[:alnum:]_]+)*)  ]]  \
&& echo ${BASH_REMATCH[1]} ${BASH_REMATCH[2]}
http www.baidu.com

{BASH_REMATCH[0]} 即正则表达式的捕获组0(全部字符串) {BASH_REMATCH[1]} 即正则表达式的捕获组1,以此类推

BASH_REGEX 是 bash定义的保存正则表达式捕获组的变量,不同的脚本解释有不同的定义,比如zsh,ksh就有另外的变量定义方式

ksh

保存正则表达匹配数据的数组变量名叫 .sh.match ,对BASH_REMATCH,引用时必须以${.sh.match}方式引用

{.sh.match[0]} 即正则表达式的捕获组0(全部字符串) {.sh.match[1]} 即正则表达式的捕获组1,以此类推

zsh

MATCH 保存匹配的整个字符串,对应就是bash的BASH_REMATCH[0] match保存捕获组数据的数组(索引从1开始),

通用的实现

根据上面不同shell的实现试可以合成实现一个通用函数来以抹平shell之间的差异

代码语言:javascript
复制
function reMatch {
  typeset ec
  unset -v reMatch # initialize output variable
  [[ $1 =~ $2 ]] # perform the regex test
  ec=$? # save exit code
  if [[ $ec -eq 0 ]]; then # copy result to output variable
    [[ -n $BASH_VERSION ]] && reMatch=( "${BASH_REMATCH[@]}" )
    [[ -n $KSH_VERSION ]]  && reMatch=( "${.sh.match[@]}" )
    [[ -n $ZSH_VERSION ]]  && reMatch=( "$MATCH" "${match[@]}" )
  fi
  return $ec
}

调用示例:

代码语言:javascript
复制
$ reMatch "http://www.baidu.com" "(https?)://([[:alnum:]]+(\.[[:alnum:]_]+)*)"
$ echo ${reMatch[1]} ${reMatch[2]}
http www.baidu.com

更详细的说明参见参考资料1

参考资料


  1. 《retrieve a word after a regular expression in shell script》 ↩︎
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-12-03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • bash
  • ksh
  • zsh
  • 通用的实现
    • 调用示例:
    • 参考资料
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档