Linux正则表达式

目录

一、正则表达式是什么?

二、基础正则表达式

1.正则表达式中的特殊字符

2.bash中grep的基础用法及结合正则表达式的进阶用法

3.行首、行尾字符 ^ $

4.任意一个字符  .  与重复字符  *

5.限定范围的字符{}

三、sed工具

1.sed概述

2.以行为单位的新增、删除

3.以行为单位的取代、显示

4.部分数据的搜寻并取代的功能

5.直接修改文件内容

四、延伸正则表达式

总结



前言

       正则表达式是通过一些特殊字符的排列,用以搜寻、取代、删除一列或单列字符串,简单的说,正则表达式就是用在字符串的处理上面的一项表达式。本文对鸟哥linux私房菜中所介绍的常用正则表达式进行记录总结,方便后续查阅。


一、正则表达式是什么?

       正则表达式就是处理字符串的方法,他是以行为单位来进行字符串的处理行为,正则表达式通过一些特殊字符的辅助,可以让使用者轻易的达到搜寻、删除、取代某特定字符串的处理程序!



二、基础正则表达式

1.正则表达式中的特殊字符

       使用正则表达式时,需要特别留意当时环境为何语系,不同的语系使用正则表达式处理的结果可能会不同,一些特殊的字符可以避免这种差异。​​​​​​​

特殊字符
特殊字符代表意义
[:alnum:]代表英文大小写字符及数字
[:alpha:]代表英文大小写字符
[:blank:]代表空格和Tab两者
[:cntrl:]代表键盘上面的控制按键,包括CR,LF,Tab,Del等等
[:digit:]代表数字
[:graph:]除了空格和Tab按键外的其他所有按键
[:lower:]代表小写字母
[:print:]任何可以被打印出来的字符
[:punct:]代表标点符号,如“ ‘ ? ! ; :# $ 等等
[:upper:]代表大写字母
[:space:]任何会产生空白的字符,包括空格,Tab,CR等
[:xdigit:]代表16进位的数字类型,包括:0-9,A-F,a-f的数字和字符

2.bash中grep的基础用法及结合正则表达式的进阶用法

grep的基础用法

grep [-acinv] '查找的字符串' filename

选项参数
-a : 不要忽略二进制数据,将二进制文件按照视为文本文件搜寻
-c : 计算找到'查找字符串'的次数
-i : 忽略大小写
-n ; 输出行号
-v : 反向输出,显示不包含匹配文本的所有行

grep的进阶用法

grep [-A] [-B] '查找的字符串' filename

选项参数
-A : 后面可以加数字n,为after的意思,除了列出查找出的该行外,后面的n行也列出来
-B : 后面可以加数字n,为before的意思,除了列出查找出的该行外,前面的n行也列出来

3.行首、行尾字符 ^ $

行首字符^

#不要开头是英文字母的行

grep -n '^[^a-zA-Z]' filename
#or
grep -n '^[^[:alpha:]]' filename

#对于符号 ^ ,在字符集合符号(括号[])之内和之外是不同的,在[]内代表的是反向选择,在[]之外则代表定位在行首的意义。

行尾字符$

#不显示空白行以及'#'注释行

grep -v '^$' filename | grep -v '^#'

#通过(^$)可以匹配空白行

4.任意一个字符  .  与重复字符  *

在bash中,通配符 * 用来代表任意(0或这多个)字符,但是正则表达式中却有不同的含义

. (小数点):代表一定有一个任意字符的意思
* (星号):代表重复前一个字符,0到无穷多次的意思

5.限定范围的字符{}​​​​​​​

        {}用来限制一个范围区间内的重复字符数,因为 { 与 } 的字符在shell是由特殊意义的,因此,必须使用跳脱字符 \ 来让其失去特殊意义。

#找出g后面接2到5个o,然后再接一个g的字符串

grep -n 'go\{2,5\}g' filename


三、sed工具

1.sed概述

       sed本身也是一个管线命令,可以分析standard input,而且sed还可以将数据进行取代、删除、新增、选取特定行等等的功能。

sed [-nefr] [动作]

选项与参数:
-n :使用安静模式,在一般sed的用法中,所有来自STDIN的数据一般都会被列出到屏幕上。但是如果
     加上-n参数后,则只有经过sed特殊处理的那一行(或者动作)才会被列出来。
-e :直接在指令模式上进行sed动作编辑。
-f :直接将sed的动作写在一个文件内,-f filename则可以执行filename内的sed动作。
-r :sed的动作支持的是延伸型正则表达式的语法。(预设的是基础正则表达式语法)
-i :直接修改读取的文件内容,而不是由屏幕输出。

动作说明:[n1[,n2]]function
n1,n2 :不一定会存在,一般代表的是选择进行动作的行数。

function:
a :新增,a的后面可以接字符串,而这些字符串会在新的一行出现,目前的下一行。
c :取代,c的后面可以接字符串,这些字符串可以取代n1-n2的行。
d :删除,
i :插入,i的后面可以接字符串,而这些字符串会在新的一行出现,目前的上一行。
p :打印,即将某个选择的数据打印出,通常与参数sed -n一起运作。
s :取代,例 1,20s/old/new/g

2.以行为单位的新增、删除

#将filename中内容列出并且打印行号,同时,将2~5行删除
nl filename | sed '2,5d'

#在第二行后加上********
nl filename | sed '2a ********'

#在第二行后面加入两行字,例如:drink tea or ...... 与 drink beer?
nl filename | sed '2a drink tea or ......\
drink beer?'

3.以行为单位的取代、显示

#将2-5行的内容替换为 No 2-5 number
nl filename | sed '2,5c No 2-5 number'

#仅列出filename文件内的第5-7行,若不加-n,文件内容会全部输出,且5-7行会重复输出
nl filename | sed -n '5,7p'

4.部分数据的搜寻并取代的功能

sed 's/要被取代的字符串/新的字符串/g' #g为全局匹配

#删除包含字符 'MAN' 且为批注行的数据
cat filename | grep 'MAN' | sed 's/#.*$//g'  #原本的批注数据会变成空白行

cat filename | grep 'MAN' | sed 's/#.*$//g' | sed '/^$/d'  #删除空白行

5.直接修改文件内容

不使用管线命令或数据流重导向

#每一行结尾若为 . 则换成 !
sed -i 's/\.$/\!/g' filename

最后一行加入# This is a test
sed -i '$a # This is a test' filename  #$代表最后一行

四、延伸正则表达式

使用延伸正则表达式,可以使用 grep -E ,不过更建议使用egrep。

延伸表达式
字符意义
+重复一个或一个以上的前一个字符
?零个或一个前一个字符
|用或的方式找出数个字符串
()找出群组字符串
()+多个重复群组的判别

总结

以上为个人认为常见的正则表达式的汇总

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值