Linux 正则表达式 vi, grep, sed, awk

时间:2021-08-28 18:44:03

1. vi

表示内容的元字符

模式

含义

.

匹配任意字符

[abc]

匹配方括号中的任意一个字符。可以使用-表示字符范围,如[a-z0-9]匹配小写字母和阿拉伯数字。

[^abc]

在方括号内开头使用^符号,表示匹配除方括号中字符之外的任意字符。

\d

匹配阿拉伯数字,等同于[0-9]。

\D

匹配阿拉伯数字之外的任意字符,等同于[^0-9]。

\x

匹配十六进制数字,等同于[0-9A-Fa-f]。

\X

匹配十六进制数字之外的任意字符,等同于[^0-9A-Fa-f]。

\w

匹配单词字母,等同于[0-9A-Za-z_]。

\W

匹配单词字母之外的任意字符,等同于[^0-9A-Za-z_]。

\t

匹配<TAB>字符。

\s

匹配空白字符,等同于[ \t]。

\S

匹配非空白字符,等同于[^ \t]。

\a

所有的字母字符. 等同于[a-zA-Z]

\l

小写字母 [a-z]

\L

非小写字母 [^a-z]

\u

大写字母 [A-Z]

\U

非大写字母 [^A-Z]

 

表示数量的元字符

模式

含义

*

匹配0-任意个

\+

匹配1-任意个

\?

匹配0-1个

\{n,m}

匹配n-m个

\{n}

匹配n个

\{n,}

匹配n-任意个

\{,m}

匹配0-m个

\_.

匹配包含换行在内的所有字符

\{-}

表示前一个字符可出现零次或多次,但在整个正则表达式可以匹配成功的前提下,匹配的字符数越少越好

\=

匹配一个可有可无的项

\_s

匹配空格或断行

 

表示转义和位置的元字符

模式 含义 模式 含义
\* 匹配 * 字符 $ 匹配行尾
\. 匹配 . 字符 ^ 匹配行首
\/ 匹配 / 字符 \< 匹配单词词首
\\ 匹配 \ 字符 \> 匹配单词词尾
\[ 匹配 [ 字符    

替换变量

在正规表达式中使用 \( 和 \) 符号括起正规表达式,即可在后面使用\1、\2等变量来访问 \( 和 \) 中的内容。

懒惰模式

\{-n,m} 与\{n,m}一样,尽可能少次数地重复

\{-} 匹配它前面的项一次或0次, 尽可能地少

 2. grep   (global regular expression and print the line)

 ^

  锚定行的开始 如:'^grep'匹配所有以grep开头的行。

  $

  锚定行的结束 如:'grep$'匹配所有以grep结尾的行。

  .

  匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。

  *

  匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。 .*一起用代表任意字符。

  []

  匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。

  [^]

  匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-F和H-Z的一个字母开头,紧跟rep的行。

  \(..\)

  标记匹配字符,如'\(love\)',love被标记为1。

  \<

  锚定单词的开始,如:'\<grep'匹配包含以grep开头的单词的行。

  \>

  锚定单词的结束,如'grep\>'匹配包含以grep结尾的单词的行。

  x\{m\}

  重复字符x,m次,如:'o\{5\}'匹配包含5个o的行。

  x\{m,\}

  重复字符x,至少m次,如:'o\{5,\}'匹配至少有5个o的行。

  x\{m,n\}

  重复字符x,至少m次,不多于n次,如:'o\{5,10\}'匹配5--10个o的行。

  \w

  匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。

  \W

  \w的反置形式,匹配一个或多个非单词字符,如点号句号等。

  \b

  单词锁定符,如: '\bgrep\b'只匹配grep。

egrep 支持 +, ?, | 等

3. sed - stream editor for filtering and transforming text

sed每次处理一行内容。处理时先把当前要处理的行存储在临时缓冲区,(称为“模式空间”,pattern space),用sed命令处理完成后(命令hHgGx用于处理hold space,跟模式空间一起完成处理),把缓冲区的内容送往output(即屏幕)。然后处理下一行,依次重复到文件末尾。sed不改变文件的内容变,但可以将结果重定向。

sed定址:

可以直接通过指定行数或者模式或者二者的组合选定要进行编辑的行, 如果不指定则处理所有的行。

sed '2,5d' file    # 删除第2~5行

sed-n'3p'   file  # 只打印第三行 -n表示不打印匹配的行

sed'/My/,/You/d' file  # 删除my~You之间的行

 命令  功能
 a\

 在当前行后添加一行或多行。多行时除最后一行外,每行末尾需用“\”续行

 c\  用此符号后的新文本替换当前行中的文本。多行时除最后一行外,每行末尾需用"\"续行
 i\  在当前行之前插入文本。多行时除最后一行外,每行末尾需用"\"续行
 d  删除行
 h  把模式空间里的内容复制到暂存缓冲区
 H  把模式空间里的内容追加到暂存缓冲区
 g  把暂存缓冲区里的内容复制到模式空间,覆盖原有的内容
 G  把暂存缓冲区的内容追加到模式空间里,追加在原有内容的后面
 l  列出非打印字符
 p  打印行(模式空间)
 n  读入下一输入行,并从下一条命令而不是第一条命令开始对其的处理
 r  从文件中读取输入行
 !  对所选行以外的所有行应用命令
 s  用一个字符串替换另一个
 g  在行内进行全局替换
 w  将所选的行写入文件
 x  交换暂存缓冲区与模式空间的内容
 y  将字符替换为另一字符(不能对正则表达式使用y命令)

 

 元字符  功能  示例
 ^  行首定位符  /^my/  匹配所有以my开头的行
 $  行尾定位符  /my$/  匹配所有以my结尾的行
 .  匹配除换行符以外的单个字符  /m..y/  匹配包含字母m,后跟两个任意字符,再跟字母y的行
 *  匹配零个或多个前导字符  /my*/  匹配包含字母m,后跟零个或多个y字母的行
 []  匹配指定字符组内的任一字符  /[Mm]y/  匹配包含My或my的行
 [^]  匹配不在指定字符组内的任一字符  /[^Mm]y/  匹配包含y,但y之前的那个字符不是M或m的行
 \(..\)  保存已匹配的字符  1,20s/\(you\)self/\1r/  标记元字符之间的模式,并将其保存为标签1,之后可以使用\1来引用它。最多可以定义9个标签,从左边开始编号,最左边的是第一个。此例中,对第1到第20行进行处理,you被保存为标签1,如果发现youself,则替换为your。
 &  保存查找串以便在替换串中引用  s/my/**&**/  符号&代表查找串。my将被替换为**my**
 \<  词首定位符  /\<my/  匹配包含以my开头的单词的行
 \>  词尾定位符  /my\>/  匹配包含以my结尾的单词的行
 x\{m\}  连续m个x  /9\{5\}/ 匹配包含连续5个9的行
 x\{m,\}  至少m个x  /9\{5,\}/  匹配包含至少连续5个9的行
 x\{m,n\}  至少m个,但不超过n个x  /9\{5,7\}/  匹配包含连续5到7个9的行

 sed 不管是否找到指定的模式,退出状态都是0。只有当命令存在语法错误时,sed的退出状态才不是0。

4. awk  - pattern scanning and processing language

awk 命令逐行扫描文件,寻找匹配特定模式的行,并在这些行上进行操作。命令语法:

awk -F域分隔符 'command'  file

awk  -f script-file  file

command 由pattern + {action}组成,两者均为可选。如果没有指定模式,则应用到所有行;如果没有指定动作,则打印到标准输出 (屏幕)。

模式可以为:

/正则表达式/

关系表达式

模式匹配表达式: ~ 和 ~!

行的范围

BEGIN

END

action可以为:

变量或数组赋值

输出

函数操作

控制流命令