Skip to content

Latest commit

 

History

History
72 lines (46 loc) · 2.6 KB

在字符串中匹配正则表达式.md

File metadata and controls

72 lines (46 loc) · 2.6 KB

在字符串中匹配正则表达式

# sh
regex() {
	# Usage: regex "string" "regex"
	[[ $1 =~ $2 ]] && printf '%s\n' "${BASH_REMATCH[1]}"
}

语法说明:

使用范例: regex "   aaa  bbb  ccc  " "\s{2}(.{3})"

[[ $1 =~ $2 ]]

  • 在bash3.0之后,bash内置了regexp ,=~就是match匹配;
  • =~左边为源字符串,右边为pattern,表示以 pattern 对该操作符左边的展开内容进行匹配;
  • 需要注意的是:当使用单引号或双引号将 pattern 括起来的时候,括起来的 pattern 将会变为一般字符而非正则表达式元字符 即:[[ "   aaa  bbb  ccc  " =~ "\s{2}(.{3})" ]]不会匹配到任何内容,但由于代码里用的是$2变量,则不存在这种问题。

"${BASH_REMATCH[1]}"

  • bash会将匹配到的结果保存到 BASH_REMATCH 数组中,BASH_REMATCH[0] 表示匹配到的所有内容,BASH_REMATCH[1]–BASH_REMATCH[n] 依次存放匹配到的各个子组

bash中(),{},(()),[],[[]]的区别

  1. () 一个命令组合,相当于一个命令组(括号中的名字在子shell中运行) [root@abenmao ~]# I=123;(echo $I;I=xyz;echo $I;);echo $I 123 xyz 123

  2. {} 也是一个命令组合,不过与()不同的是,{}中的命令是在当前shell执行 [root@abenmao ~]# I=123;{ echo $I;I=xyz;echo $I; };echo $I 123 xyz xyz 另外需要注意的是,{}是一个keyword,所以在命令与两边的{需用空格隔离,同时使用";"表示命令结束。

  3. [] []主要用作条件判断,判断对象包括文件类型和赋值比较, 需要特别注意的是,[是一个builtin内置命令,故在其中的变量引用或常量,需使用双引号或者单引号括起来, 否则会出现单词分割(Word-Splitting)现象。

    常见的比较测试如下:

    • 数字测试:-eq -ne -lt -le -gt -ge

    • 文件测试:-r、-l、-w、-x、-f、-d、-s、-nt、-ot

    • 字符串测试:=、!=、-n、-z、>、<

    • 逻辑测试:-a、-o、!

  4. (()) 支持四则运算,等同于let功能

  5. [[]]

    • [[]]类似于[],用于比较功能,但是支持正则表达式;
    • [[]]为一个keyword,括号与表达式中间必须要有空格进行隔离;
    • [[]]的逻辑运算符为"&&"、"||",支持逻辑短路