在写bash命令的时候,有时候需要操作字符串,提取匹配的内容,然而shell里面操作正则的资料比较少,所以做下记录,有两种方法
grep正则获取字符串
语法
grep <选项> <正则表达式>
grep 命令用于查找文件里符合条件的字符串,比如查找端口占用情况
ps -ef|grep 8080
在使用文本查找的时候,可以设置对应的正则表达式,可选的正则如下
- -G 使用基本正则表达式, --basic-regexp
- -e 使用 PATTERN 来进行匹配操作, --regexp=PATTERN (默认)
- -E 使用可扩展的正则表达式, --extended-regexp
- -P 使用Perl 正则表达式, --perl-regexp
- -F 使用断行符进行分隔进行匹配的定长字符串, --fixed-strings
- -f 从 FILE 中取得 PATTERN, --file=FILE
- -i 匹配忽略大小写,--ignore-case
- -w 强制 PATTERN 仅完全匹配字词, --word-regexp
- -x 强制 PATTERN 仅完全匹配一行, --line-regexp
- -z 一个 0 字节的数据行,但不是空行, --null-data
grep实战
现在有一串字符串 my age is 29 and my name is kelen
比如我要获取这个 age
的值,可以这样
echo $name | grep -Eo "[0-9]+"
-E 可扩展的正则
-o 输出匹配的结果
sed正则获取字符串
语法
sed 's/<pattern>/<replace>/[g p w n]'
参数s用来替换文本,支持的特殊字符有 . ,?, +, {, |, (, )
sed实战
获取上面字符串的29可以这样实现
echo "my age is 29 and my name is kelen" | sed -E 's/.* ([0-9]*) .*/\1/g'
由于正则没有js那样灵活,所以这个正则 s/.* ([0-9]*) .*/\1/g
有点恶心,不过暂时能满足需求,就这样吧