BASH_REMATCH[n]用法
用法 Bash
2023-09-14 09:08:38 时间
转载自https://blog.csdn.net/dc666/article/details/46007507
从 bash 3以上版本里,已经自带正则匹配的功能, 很多情况下,可以不用awk/sed来做。 比如这个需求:
<List>
<Job id="1" name="abc"/>
<Job id="2" name="zyz"/>
<Job id="3" name="beew"/>
</List>
想要得到这个结果。
abc | 1
zyz | 2
beew | 3
我们用纯shell的方法。
#!/bin/bash
while read line; do //读入变量line
if [[ $line =~ id=\"([0-9]+).*name=\"([^\"]*) ]]; then //子模式1为([0-9]+);子模式2为([^\"]*)
echo "${BASH_REMATCH[2]} | ${BASH_REMATCH[1]}"
fi
done < file
他的理解:
子模式1为匹配出现一次或多次(+号的作用)任意0~9字符;子模式2为出现零次或多次(*号的作用)的非双引号"字符,其中[^"]取一切非双引号单个字符,反斜杠\用来转义双引号"。接下来的echo "${BASH_REMATCH[n]}"中,按照先读取匹配子模式2的数组内容BASH_REMATCH{2},即上例中的abc,xyz,beew等等,接着打印竖线|,最后读取匹配子模式1的数组内容,即1,2,3。
在运维场景下,我们经常需要在服务器上用正则表达式来匹配IP地址。
shell和其它编程语言一样,也可以使用正则分组捕获,不过不能使用 $1或\1这样的形式来捕获分组,可以通过数组${BASH_REMATCH}来获得,如${BASH_REMATCH[1]},${BASH_REMATCH[N]}
下面以ip="121.0.2.2"为例,shell脚本代码如下(当然,你要做成更通用交互式的脚本,可以通过expect来实现):
#!/bin/bash
ip="121.0.2.2"
if [[ $ip =~ ^([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$ ]]
then
echo "Match"
echo ${BASH_REMATCH[1]}
echo ${BASH_REMATCH[2]}
echo ${BASH_REMATCH[3]}
echo ${BASH_REMATCH[4]}
else
echo "Not match"
fi
返回结果为
Match
121
0
2
2
相关文章
- SQL中EXISTS的用法
- tar命令基本用法
- Jdk8 之 Stream流详细用法(一)
- SQL判断语句用法和多表查询
- FlexboxLayout 的一些基本介绍与基本用法详解手机开发
- window.onload用法详解编程语言
- Python3.x:bs4解析html基础用法详解编程语言
- Shell for循环及用法举例
- 不恰当使用Oracle中的NOT运算符(oraclenot用法)
- 解析Linux时间参数的正确用法(linuxdate参数)
- Linux下的Bash编程简介(linux中的bash)
- Linux源码研究之Bash(linux源码bash)
- 版本Linux查看Bash版本: 一步一步指南(linux查看bash)
- 深入剖析Linux下Bash命令行:解密其强大功能及使用技巧(Linux下bash)
- Oracle 求和函数 Sum 用法详解(oraclesum求和)
- 数据使用Bash快速读取MySQL数据(bash 读取mysql)
- 快速搭建MySQL数据库环境使用Bash脚本(bash脚本 mysql)
- Oracle中实现输出结果的OUT用法(oracle中out)
- phpis_file()和is_dir()用于遍历目录时用法注意事项
- UserData用法总结lanyu出品
- sqlserver中distinct的用法(不重复的记录)
- Function.prototype.bind用法示例
- confirm的用法示例用于按钮操作时确定是否执行
- .NET中的IO操作之文件流用法分析