首页 正则与常用命令操作
文章
取消

正则与常用命令操作

一. 什么是正则表达式

要匹配一个字符串,有哪些元素可以描述这个匹配的请求长什么样子呢?如何表达自己的匹配需求呢?

正则表达式就是一套描述匹配需求的规则定义,设定一套通用的标准,不同的语言都能根据这个标准就能理解你想匹配的字符串长什么样。可以将不同的程序语言想象成现实中的语言, 匹配的字符串就是你要找的一个人, 那么如何通过对方的语言告诉对方你要找的人张什么样子,有什么特征,眼睛嘴巴肤色头发等,这些特征就是正则表达式的规则。

需要注意的是每个语言支持的正则表达式都不是完全一样的,使用具体的语言的时候要参考具体的语言的正则表达式说明,就好像现实里一些词是每个语言里面都有的东西, 例如头发,眼睛,嘴巴,每个语言都能找到对应的翻译。但是有的词语自己这项语言作为方言特有的词语, 例如粤语里面的“xxx”。java,python,shell,go等等都有自己的正则表达式的支持,语法也不尽相同。下面介绍一些常用且通用的规则类型,但是具体的表示语法要根据具体的语言进行查阅。

通用的正则表达式的规则主要由以下的类型:

  1. 元字符匹配(主要就是ASCII码表中的各种字符类型的匹配,可见字符,不可见字符,特殊字符)
  2. 出现次数匹配(0次,1次,多次)
  3. 位置匹配(行首,行末)
  4. 分组和后向引用(提取匹配的字符串)
  5. 匹配模式(贪婪,最小匹配)

正则的处理主要有两部分内容:

  1. 我们能怎么匹配想要的内容
  2. 匹配到想到的内容后我们能做什么操作

二. 通用正则表达式

  1. 元字符匹配-普通字符

    .:匹配任一字符(换行符除外)

    [a-zA-Z]:匹配a到z任一字符

    [^abc]:匹配任一不是abc的字符

  2. 次数匹配

    *:匹配前面字符任意次

    ?:匹配前面字符0或1次

    +:匹配前面字符至少1次

    {m,n}:匹配前面字符至少m次,最多n次

  3. 位置匹配

    ^:匹配字符串的开始位置,在中括号中使用时表示不接受方括号表达式中的字符集合[^abc]

    $:匹配字符串的结尾位置

  4. 分组和后向引用

    ():表示一个子表达式,\1 \2 \3就叫做后向引用,表示第几个表达式所匹配到的内容

上面是常用的标准正则表达式的规则定义描述, 还有一些不常用的没有列举出来的包括

  1. 不可见字符,包括什么空白符,换行符号,制表符等等
  2. 特殊符号,例如上面表示语法的那些符号 * . ? 等等

这里以shell中的正则表达式作为作为例子演示匹配分组。

三. grep 命令

1
grep [option] [PATTERN] [file...]

option部分

option所属类别说明
-EMatcher类型选择使用拓展Pattern
-v匹配控制反转匹配
-i匹配控制忽略待匹配的字符大小写
-l输出控制输出匹配的内容,默认输出文件名
-r文件选择控制递归选择

四. sed命令

sed(Stream Editor)的原理是将待匹配行输入进行操作,然后输出到标准输出流中。

1
sed [OPTION] script [inputfile]

4.1 option部分

option说明
-n仅输出匹配的模式空间内容
-r支持拓展的正则表达式
-i直接编辑源文件

4.2 script部分

1
sed [option] "定界+编辑" file

script主要有两部分内容:

  1. 一个是定界,就是匹配仅模式空间的内容行怎么选定。规则有正则表达式定界,行数定界,行数步进定界。
  2. 另一个是编辑,就是对这些选中的行做什么操作,替换,在后面插入,在前面插入,在匹配行的下一行插入

【定界-全文匹配】 定界部分值为空,就是全文匹配。 sed "a line1\nline2" file 或者 sed "//a line1\nline2" file

【定界-范围匹配】

定界方式说明示例示例说明
n,m第n行到m行的内容sed -n “1,2p” file匹配1-2行到模式空间中,并且打印出来
n,k+第n行开始,往后的k行sed -n “1,+3p”匹配第1行开始,往后的3行,并且打印出来
n,/pattern/第n行开始,至pattern匹配到的那一行sed -n “1,/maven/p”匹配第一行开始,直到匹配到maven的行,并且打印出来
/pattern/, /pattern/第一个pattern到第二个pattern的行sed -n “/article/, /maven/p” 

【定界-单行匹配】

定界方式说明示例示例说明
n匹配第几行sed -n “1p” file匹配第一行,并且打印
/pattern/模式匹配到的所有行sed -n “/patter/p” file打印出匹配的行

【编辑】

编辑命令说明示例示例说明
d删除整行sed “/pattern/d” file删除匹配行
a在界定行的下一行appendsed “/pattern/a line1\nline2” file在匹配行的下面append新的两行line1和line2
i在界定行的上一行appendsed “/pattern/i line1\nline2” file在匹配行的上面append新的两行line1和line2
w将匹配行保存到特定的文件中sed “/pattern/w /temp/fstore” file将匹配行保存到/temp/fstore文件中
r读取指定的文件内容,添加到匹配的行后面sed “/pattern/r /etc/config” file将/etc/config中的内容,append到file中模式匹配的后面
s匹配的内容做条件替换sed “/pattern/s/$/abc” file将匹配的内容的末尾替换成abc,也就是在匹配的字符串后面插入
g全局替换sed “s/abc/hhhh/g” file界定符为空,即全文扫描,将abc替换成hhh
p打印  

4.3 高级用法

对同一个文件执行多个模式操作有三种方式可以实现:

  1. 通过管道符,来顺序执行完多个模式操作
  2. 通过多个-e参数来指定多个多个模式操作
  3. 单个sed命令中通过分号分割多个模式操作

五.awk命令

参考:

https://blog.51cto.com/u_15257216/5417009

本文由作者按照 CC BY 4.0 进行授权

go

k8s搭建轻量linux虚机