linux通配符和正则表达式
https://blog.csdn.net/weixin_42067873/article/details/97390875
https://www.jianshu.com/p/25f3d0cd5fdc
使用Shell命令时,要分清楚哪里用的是通配符表达式,哪里用的是正则表达式。
1. 通配符知识:
一般用户命令行bash环境,注意区别部分符号在通配符和正则表达式中含义不同。
* --代表所有(0个或多个)字符 如:*.sh 匹配所有以 .sh 结尾的文件
? --任意一个字符
; --连续不同命令的分隔符
# --配置文件的注释
| --管道符
~ --当前用户的家目录
- --上一次所在路径
/ --路径分隔符,也是根的意思
` --反引号中间为命令会先执行,等价于 $()
“ --双引号具有变量置换功能,解析变量后输出,不加引号相当于双引号
‘ --单引号不具有变量置换功能,输出所见即所得(原样输出)
.. --代表上一级目录
[list] 匹配 list 中的任意单个字符。a[xyz]b,a与b之间必须也只能有一个字符, 但只能是 x 或 y 或 z, 如 axb, ayb, azb。
[!list] 匹配除 list 中的任意单一字符。a[!0-9]b,a与b之间必须也只能有一个字符, 但不能是阿拉伯数字, 如 axb, aab, a-b。
[c1-c2] 匹配 c1-c2 中的任意单一字符。a[0-9]b,匹配0与9之间其中一个字符,如 a0b, a1b... a9b
2. 正则表达式
为处理大量的字符串而定义的一套规则和方法,正则表达式一般以行为单位处理。
常用标识符及补充 (只要是字符串需双引号引起来):
^word: 以word开头的行
word$: 以word结尾的行
^$: 代表空行 如:过滤掉空行 grep -v "^$" filename
. :匹配任意一个字符
\ :转义字符,脱掉特殊字符的特殊含义
* :匹配所有字符,重复前面字符0次到多次
.*: 匹配所有字符
^.*: 匹配以任意多个字符开头的项
.*$:匹配以任意多个字符结尾的项
[abc] : 匹配abc任意一项
[^abc] : 匹配不包含abc任意一项的项
a\{m,n\} : 匹配a至少m次,最多n次
a\{m,\} : 匹配a至少m次
a\{m\} : 匹配a恰好m次
a\{\,m} : 匹配a最多m次
\< \>:单词定位符 \< 和 \> 用于匹配一个字词的开头和结尾
\<han :以han开头的单词 han\> :以han 结尾的单词 \<han\> : 精确匹配单词 han
另外还有扩展正则表达式(了解即可) egrep或(grep -E)
+ : 重复前面的字符1次或多次
?: 重复前面的字符0次或1次
| : 表示同时过滤多个字符串 如: # egrep "3306|1521" /etc/services 匹配3306或1521
() : 分组过滤,或后项引用 如: # egrep "g(la|oo)d" filename
(han) :把han 当作一项,整串匹配
+ : 重复前面的字符1次或多次
?: 重复前面的字符0次或1次
| : 表示同时过滤多个字符串 如: # egrep "3306|1521" /etc/services 匹配3306或1521
() : 分组过滤,或后项引用 如: # egrep "g(la|oo)d" filename
(han) :把han 当作一项,整串匹配
3. 二者异同
通配符看起来和正则表达式很像,但他们并不是同一种东西。正则表达式中的那些量词的匹配规则和这里提到的几个通配符的匹配规则并不相同。如正则表达式中 * 表示重复前一个字符任意次, 而通配符表达式中 * 表示 0 或多个任意字符。在正则表达式中,ab* 表示的是那些 a 后面跟 0 个或多个 b 的字符串,而通配符表达式中 ab* 表示的是那些 ab 后面跟任意个字符的字符串。
在 Shell 命令中,通常用通配符表达式来匹配文件名,而用正则表达式来匹配一段文本内容。以 grep 命令为例,grep 命令可以在指定的文件中,挑选出和表达式匹配的那些行,其中指定文件是用的通配符表达式,而文本内容的匹配用的是正则表达式。
如果有一天我们淹没在茫茫人海中庸碌一生,那一定是我们没有努力活得丰盛