在写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正则的文档

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 有点恶心,不过暂时能满足需求,就这样吧