Linux正则表达式与通配符

https://www.cnblogs.com/zoe233/p/11919424.html
https://www.jb51.net/article/186283.htm

正则表达式:在计算机科学中,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。在很多文本编辑器或其他工具里,正则表达式通常被用来检索或替换那些符合某个模式的文本内容。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。
只有掌握了正则表达式,才能全面地掌握 Linux 下的常用文本工具(例如:grep、egrep、GUN sed、 Awk 等) 的用法

与正则有关的选项参数

grep、sed、awk天然支持正则
grep -v代表反选,反向选择匹配到的内容
grep -E代表使用扩展正则
grep -P代表使用Perl正则
sed -r 代表使用扩展正则

正则表达式分类

正则表达式分为三类(man grep可以看到,分别是basic RegExs,extended RegExs,perl RegExs)
1、基本的正则表达式(Basic Regular Expression 又叫 Basic RegEx 简称 BREs)
2、扩展的正则表达式(Extended Regular Expression 又叫 Extended RegEx 简称 EREs)
3、Perl 的正则表达式(Perl Regular Expression 又叫 Perl RegEx 简称 PREs)

常用文本工具与正则表达式的关系

指令 BREs EREs PREs 处理对象
grep egrep grep grep -E
egrep grep -P
egrep -P a. 处理对象:文本文件

b. 处理过程:查找文本文件中是否包含要查找的 “关键字”(关键字可以是正则表达式) ,默认返回匹配的该行的内容
c. grep|egrep处理文件时,按行处理 |
| sed | sed | sed -r | - | a. 处理对象:文本文件
b.处理操作:对文本文件的内容进行 查找、替换、删除、增加等操作
c. sed 在处理文本文件的时候,按行处理 |
| awk | - | awk | - | a. awk 处理的对象:文本文件
b. awk 处理操作:主要是对列进行操作 |

三种正则比较**

字符 BREs EREs PREs 说明
转义 \ \ \ 转义
^ ^ ^ ^ 匹配行首,例如'^dog'匹配以字符串dog开头的行(注意:awk 指令中,^则是匹配字符串的开始)
$ $ $ $ 匹配行尾,例如:'^、dog则是匹配字符串的结尾)
^$ ^$ ^$ ^$ 匹配空行
^string$ ^string$ ^string$ ^string$ 匹配行,例如:'^dog$'匹配只含一个字符串 dog 的行
\< \< \< X 同\b 匹配单词,例如:'\
> \> \> 匹配单词,例如:'frog\>'(等价于'frog\b '),匹配以 frog 结尾的单词
\ \ 匹配一个单词或者一个特定字符,例如:'\'(等价于'\bfrog\b')、'\'
() **X **同\(\) () () 匹配表达式,例如:不支持'(frog)'
() \(\) **X ** **X**** ** 匹配表达式,例如:不支持'(frog)'
X(同?) 匹配前面的子表达式 0 次或 1 次(等价于{0,1}),例如:where(is)?能匹配"where" 以及"whereis"
\? \? **X ** **X**** ** 匹配前面的子表达式 0 次或 1 次(等价于'\{0,1\}'),例如:'where\(is\)\? '能匹配 "where"以及"whereis"
?(非贪婪模式) **X ** **X ** **X**** ** 当该字符紧跟在任何一个其他限制符(*, +, ?, {n},{n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个"o",而 'o+' 将匹配所有 'o'
. . . . 匹配除换行符('\n')之外的任意单个字符(注意:awk 指令中的句点能匹配换行符)
* * * * 匹配前面的子表达式 0 次或多次(等价于{0, }),例如:zo* 能匹配 "z"以及 "zoo"
\+ \+ X(同+) X(同+) 匹配前面的子表达式 1 次或多次(等价于'\{1, \}'),例如:'where\(is\)\+ '能匹配 "whereis"以及"whereisis"
+ X(同\+) + + 匹配前面的子表达式 1 次或多次(等价于{1, }),例如:zo+能匹配 "zo"以及 "zoo",但不能匹配 "z"
{n} X(同{n}) {n} {n} n 必须是一个 0 或者正整数,匹配子表达式 n 次,例如:
zo{2}能匹配"zooz",但不能匹配 "Bob"
{n,} X(同\{n,\}) {n,} {n,} n 必须是一个 0 或者正整数,匹配子表达式大于等于 n次,例如:go{2,}能匹配 "good",但不能匹配 god
{n,m} X(同\{n,m\}) {n,m} {n,m} m 和 n 均为非负整数,其中 n <= m,最少匹配 n 次且最多匹配 m 次 ,例如:o{1,3}将配"fooooood" 中的前三个 o(请注意在逗号和两个数之间不能有空格)
x y X(同x\|y) x|y x|y 匹配 x 或 y,例如: 不支持'z|(food)' 能匹配 "z" 或"food";'(z|f)ood' 则匹配"zood" 或 "food"
[0-9] [0-9] [0-9] [0-9] 匹配从 0 到 9 中的任意一个数字字符(注意:要写成递增)
[xyz] [xyz] [xyz] [xyz] 字符集合,匹配所包含的任意一个字符,例如:'[abc]'可以匹配"lay" 中的 'a'(注意:如果元字符,例如:. *等,它们被放在[ ]中,那么它们将变成一个普通字符)
[^xyz] [^xyz] [^xyz] [^xyz] 负值字符集合,匹配未包含的任意一个字符(注意:不包括换行符),例如:'[^abc]' 可以匹配 "Lay" 中的'L'(注意:[^xyz]在awk 指令中则是匹配未包含的任意一个字符+换行符)
[A-Za-z] [A-Za-z] [A-Za-z] [A-Za-z] 匹配大写字母或者小写字母中的任意一个字符(注意:要写成递增)
[^A-Za-z] [^A-Za-z] [^A-Za-z] [^A-Za-z] 匹配除大小写字母之外的任意一个字符(注意:写成递增)
\d 不支持 不支持 \d 匹配从 0 到 9 中的任意一个数字字符(等价于 [0-9])
\D 不支持 不支持 \D 匹配非数字字符(等价于 [^0-9])
\S 不支持 不支持 \S 匹配任何非空白字符(等价于[^\f\n\r\t\v])
\s 不支持 不支持 \s 匹配任何空白字符,包括空格、制表符、换页符等等(等价于[ \f\n\r\t\v])
\W \W \W \W 匹配任何非单词字符 (等价于[^A-Za-z0-9_])
\w \w \w \w 匹配包括下划线的任何单词字符(等价于[A-Za-z0-9_])
\B \B \B \B 匹配非单词边界,例如:'er\B' 能匹配 "verb" 中的'er',但不能匹配"never" 中的'er'
\b \b \b \b 匹配一个单词边界,也就是指单词和空格间的位置,例如: 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的'er'
\t 不支持 不支持 \t 匹配一个横向制表符(等价于 \x09和 \cI)
\v 不支持 不支持 \v 匹配一个垂直制表符(等价于 \x0b和 \cK)
\n 不支持 不支持 \n 匹配一个换行符(等价于 \x0a 和\cJ)
\f 不支持 不支持 \f 匹配一个换页符(等价于\x0c 和\cL)
\r 不支持 不支持 \r 匹配一个回车符(等价于 \x0d 和\cM)
\\ \\ \\ \\ 匹配转义字符本身"\"
\cx 不支持 不支持 \cx 匹配由 x 指明的控制字符,例如:\cM匹配一个Control-M 或回车符,x 的值必须为A-Z 或 a-z 之一,否则,将 c 视为一个原义的 'c' 字符
\xn 不支持 不支持 \xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长,例如:'\x41' 匹配 "A"。'\x041' 则等价于'\x04' & "1"。正则表达式中可以使用 ASCII 编码
\num 不支持 \num 匹配 num,其中 num是一个正整数。表示对所获取的匹配的引用
[:alnum:] [:alnum:] [:alnum:] [:alnum:] 匹配任何一个字母或数字([A-Za-z0-9]),例如:'[[:alnum:]] '
[:alpha:] [:alpha:] [:alpha:] [:alpha:] 匹配任何一个字母([A-Za-z]), 例如:' [[:alpha:]] '
[:digit:] [:digit:] [:digit:] [:digit:] 匹配任何一个数字([0-9]),例如:'[[:digit:]] '
[:lower:] [:lower:] [:lower:] [:lower:] 匹配任何一个小写字母([a-z]), 例如:' [[:lower:]] '
[:upper:] [:upper:] [:upper:] [:upper:] 匹配任何一个大写字母([A-Z])
[:space:] [:space:] [:space:] [:space:] 任何一个空白字符: 支持制表符、空格,例如:' [[:space:]] '
[:blank:] [:blank:] [:blank:] [:blank:] 空格和制表符(横向和纵向),例如:'[[:blank:]]'ó'[\s\t\v]'
[:graph:] [:graph:] [:graph:] [:graph:] 任何一个可以看得见的且可以打印的字符(注意:不包括空格和换行符等),例如:'[[:graph:]] '
[:print:] [:print:] [:print:] [:print:] 任何一个可以打印的字符(注意:不包括:[:cntrl:]、字符串结束符'\0'、EOF 文件结束符(-1), 但包括空格符号),例如:'[[:print:]] '
[:cntrl:] [:cntrl:] [:cntrl:] [:cntrl:] 任何一个控制字符(ASCII 字符集中的前 32 个字符,即:用十进制表示为从 0 到31,例如:换行符、制表符等等),例如:' [[:cntrl:]]'
[:punct:] [:punct:] [:punct:] [:punct:] 任何一个标点符号(不包括:[:alnum:]、[:cntrl:]、[:space:]这些字符集)
[:xdigit:] [:xdigit:] [:xdigit:] [:xdigit:] 任何一个十六进制数(即:0-9,a-f,A-F)

基础正则表达式说明

  1. ^ 以...开头
    • ^d 以d开头
    • ^word 匹配以word开头的内容
    • 在vi/vim编辑器里,^代表一行的开头
  2. $ 以...结尾
    • word$ 匹配以word结尾的内容
    • 在vi/vim编辑器里,$代表一行的结尾
  3. ^$ 表示空行
  4. 代表且只能代表任意一个字符
  5. \ 转义符号
    • 让特殊符号代表其本身
    • 重复0个或多个前面的一个字符
    • 例如:o* 匹配,没有"o",有1个"o",或多个"o"
  6. .* 匹配所有字符
    • 延伸:
      • ^.*以任意多个字符开头
      • .*$ 以任意多个字符结尾
  7. [abc] 匹配字符集合内的任意一个字符[a-zA-Z],[0-9]。
  8. [^abc] 匹配不包含^后的任意一个字符的内容 []内的^ 为取反,注意和中括号外面的^(以...开头的区别)
    • a{n,m} 重复n到m次,前一个重复的字符。
      • 如果用egrep 或 sed -r 可以去掉斜线
      • grep -E 也可以去掉斜线
    • a{n,} 重复至少n次,前一个重复的字符。
      • 如果用egrep 或 sed -r 可以去掉斜线
      • grep -E 也可以去掉斜线
    • a{n} 重复n次,前一个重复的字符。
      • 如果用egrep 或 sed -r 可以去掉斜线
      • grep -E 也可以去掉斜线
    • a{,m} 重复最多m次
      • grep -E 也可以去掉斜线

注意:egrep 或 sed -r 默认使用扩展正则表达式(EREs),一般特殊字符({})可以不转义

扩展正则表达式说明

grep -E 以及egrep(Extend Regular Expression)

    • 表示重复“一个或一个以上”前面的字符(* 是 0 个或多个)
  1. ? 表示重复 “0个或1个”前面的字符(. 是有且只有1个)
  2. | 表示同时过滤多个字符串
  3. () 分组过滤,后向引用

通配符

Linux通配符和三剑客的正则表达式是不一样的,因此,代表的意义也有较大的区别
通配符一般用户命令行bash环境,而linux正则表达式用于grep, sed, awk场景。

通配符说明

    • 代表任意0-N个字符,代表所有字符
  • ? 代表任意1个字符
  • ; 连续不同命令的分隔符
  • 配置文件注释

  • | 管道:效率并不高
  • ~ 当前用户的家目录
    • 上一次的目录
    • 例如:cd - 进入上一次的目录
  • $ 变量前需要加的符号
    • 例如:echo $LANG 输出变量的内容
  • / 路径分隔符号,也是根
  • 1> 重定向,覆盖

  • 追加重定向,追加内容到文件尾部

  • < 输入重定向(xargs,tr)
  • << 追加输入重定向(cat)

示例:* 的使用:代表任意0-N个字符,代表所有字符

你可能感兴趣的:(Linux正则表达式与通配符)