一、什么是正则

二、grep命令

三、sed命令

 

一、什么是正则

  • 正则就是一串有规律的字符串
  • 对于shell脚本编写有很大帮助
  • 各种编程语言中都有正则,原理一样

 

二、grep命令

2.1 grep/egrep工具的使用

格式:grep [-cinvABC] 'word' filename 过滤文件中符合条件的内容

选项:

-c:表示打印符合条件的行数

-n:表示输出符合条件的行及行号

-i:表示不区分大小写

-v:取反,表示打印输出与条件相反的内容,例-v【0-9】表示过滤不含【0-9】的行

-A:后跟数字(有无空格都可以),表示过滤符合条件的行以及下面的n行,例-A2

-B:后跟数字(有无空格都可以),表示过滤符合条件的行以及上面的n行,例-B2

-C:后跟数字(有无空格都可以),表示过滤符合条件的行以及上下各n行,例-C2

-r:遍历(级联),即在子目录或子文件中符合条件的行也会过滤出来

-rn:列出符合条件的内容在各文件中的哪一行

2.2 grep示例

第九章 正则(上)

第九章 正则(上)

第九章 正则(上)

第九章 正则(上)

第九章 正则(上)

2.3特殊字符类(上)

2.3.1 ^:匹配字符串开头,后跟符号或字母,表示以。。。开头的行

【^0-9】:过滤非0-9的字符

^【^0-9】:过滤以非0-9字符开头的行

第九章 正则(上)

2.3.2 .(点):表示任意的一个字符。

例:r.o

第九章 正则(上)

2.3.3 *(星):表示任意个字符。即*前的字符重复出现任意次,例:‘r*o’,0次就是表示‘o’

第九章 正则(上)

2.3.4 .*(点星):任意0或者多个字符,空行也包括,匹配所有

第九章 正则(上)

2.3.5 {}:大括号,表示前面字符的重复范围

第九章 正则(上)

2.4特殊字符类(下)

由于直接写特殊字符,在grep中不能被识别。使用脱义符对特殊字符进行又较麻烦,不是很方便,所以后面的几个特殊字符使用egrep进行试验。

egrep即grep -E,扩展grep

第九章 正则(上)

2.4.1 +(加号):表示+前的字符重复出现1次或多次

2.4.2 ?(问号):表示?前的字符重复出现0次或1次

第九章 正则(上)

2.4.3 |(竖线):表示或者。若后面跟多个条件,只要满足其中一个就满足要求

第九章 正则(上)

 

三、sed命令

sed和grep相比,sed也能实现grep的功能,但是有点麻烦,而且没有用颜色显示,强项在于替换

第九章 正则(上)

3.1 sed工具

格式: sed -n 'n'p filename

'n':单引号里的n是一个数字,表示第几行

-n:表示只显示我们要打印的行,无关紧要的不显示

p:print ,打印

其他选项:

-e:后面跟多个表达式(匹配行或字符串)

I:不区分大小写

-i配合d使用,删除文件中的内容行(修改了文件内容)可以理解为先vim进入文件,再dd删除

d:只在屏幕上删除行,并把其它的显示出来(未修改文件内容)

''(单引号)里为字符串时,使用 //

第九章 正则(上)

第九章 正则(上)

第九章 正则(上)

3.2特殊字符(与grep的特殊字符意义相同)

-r:sed的转义

.(点)

*(星)

.*(点星)

+(加)

?(问)

|(表示或者)

第九章 正则(上)

3.3 替换功能(重要)

sed 'n1,n2s/word1/word2/g' filename:把n1到n2行之间的word1换成word2,不加g则只替换每行的第一个

sed '1,$s/word1/word2/g' filename:把文件中所有的word1换成word2,不加g则只替换每行的第一个

类似Vim中的替换

3.3.1替换字符或字符串示例

第九章 正则(上)

第九章 正则(上)

第九章 正则(上)

第九章 正则(上)

3.3.2调换两个字符串的位置

sed -r ‘s/([^:]+):(.*):([^:]+)/\3:\2:\1/’   把文件中第一段和最后一段的内容调换位置(也可以理解为由:把文件每一行的内容分为三部分,并把第一部分和第三部分的位置进行调换

[^:]+ : 以非冒号开始,一个或多个字符

:(.*): :贪婪匹配,一直匹配到最后一个冒号 

[^:]+ :以非冒号开始,一个或多个字符

\3是一个整体

第九章 正则(上)

注:替换或位置调换也只是在屏幕上显示的内容里表示出来,源文件内容没有被修改

3.4直接修改文件的内容

-i选项,可以直接修改源文件内容

sed -i 's/word1/word2/g filename

3.5文件中大小写替换

\u:表示大写

\l:表示小写

  • 1. 把每个单词的第一个小写字母变大写:
  • sed 's/\b[a-z]/\u&/g' filename
  • 2. 把所有小写变大写:
  • sed 's/[a-z]/\u&/g' filename
  • 3. 大写变小写:
  • sed 's/[A-Z]/\l&/g' filename
     

&:前面word1表示的字符或字符串( 第一个 // 里面的内容)

\b 表示单词的边界,匹配单词的开始或结束 

 

3.6在指定行的上一行或下一行插入指定字符

a\:在指定行下面一行开始插入指定字符

i\:在指定行上面一行开始插入指定字符

sed '1\a 123456789' 1.txt    //在文件第一行的下一行插入字符123456789

sed '1\i 123456789' 1.txt   //在文件第一行的上一行插入字符123456789

相关文章:

  • 2022-02-28
  • 2022-12-23
  • 2021-09-22
  • 2021-10-05
  • 2021-08-27
  • 2021-05-05
  • 2021-07-10
  • 2021-06-08
猜你喜欢
  • 2022-12-23
  • 2021-07-07
  • 2021-10-21
  • 2022-12-23
  • 2021-08-30
  • 2021-11-22
相关资源
相似解决方案