正则表达式、sed、awk

正则表达式

不限语言只针对文件内容进行处理。

正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。

字符类
在这里插入图片描述数量限定符
在这里插入图片描述位置限定符
在这里插入图片描述其他特殊字符
在这里插入图片描述在这里插入图片描述![在这里插入图片描述](https://img-blog.csdnimg.cn/20200813154141844.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTc4NzY1Mg==,size_16,color_FFFFFF,t_70#pic_center

sed 处理文件的行数据

在这里插入图片描述

在这里插入图片描述

Linux sed 命令是利用脚本来处理文本文件。
sed 可依照脚本的指令来处理、编辑文本文件。
Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。

语法

sed [-hnV][-e<script>][-f<script文件>][文本文件]

参数说明:

  -e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。
    -f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
    -h或--help 显示帮助。
    -n或--quiet或--silent 仅显示script处理后的结果。
    -V或--version 显示版本信息。

动作说明:

 	a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
    c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
    d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
    i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
    p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
    s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!

使用-i才可以修改源文件

huislee@huislee-virtual-machine:~$ sed 's/echo/echos/g' test.sh 
#!/bin/bash
echos "自定义变量"
num=100
echos $num
unset num
echos $num
readonly var=100
echos $var
#unset var
read string
export  huislee=$string
name="a12$%^&~  @sd"
echos "$name is you"
echos -e '$name is you \n'
huislee@huislee-virtual-machine:~$ cat test.sh 
#!/bin/bash
echo "自定义变量"
num=100
echo $num
unset num
echo $num
readonly var=100
echo $var
#unset var
read string
export  huislee=$string
name="a12$%^&~  @sd"
echo "$name is you"
echo -e '$name is you \n'
huislee@huislee-virtual-machine:~$ sed -i 's/echo/echos/g' test.sh 
huislee@huislee-virtual-machine:~$ cat test.sh 
#!/bin/bash
echos "自定义变量"
num=100
echos $num
unset num
echos $num
readonly var=100
echos $var
#unset var
read string
export  huislee=$string
name="a12$%^&~  @sd"
echos "$name is you"
echos -e '$name is you \n'

huislee@huislee-virtual-machine:~$ 

使用以下方式会将匹配的再打印一次,但是源文件也会输出;可以使用-n静默输出只输出匹配的行
在这里插入图片描述

huislee@huislee-virtual-machine:~$ sed '/num/p' test.sh
#!/bin/bash
echo "自定义变量"
num=100
num=100
echo $num
echo $num
unset num
unset num
echo $num
echo $num
readonly var=100
echo $var
#unset var
read string
export  huislee=$string
name="a12$%^&~  @sd"
echo "$name is you"
echo -e '$name is you \n'
huislee@huislee-virtual-machine:~$ sed '/num/p' test.sh -n
num=100
echo $num
unset num
echo $num

使用&可以替换复杂的字符串
在这里插入图片描述在这里插入图片描述

awk处理文件的列数据

在这里插入图片描述

在这里插入图片描述在这里插入图片描述

huislee@huislee-virtual-machine:~$ ps aux | awk '{print $2}'| more
PID
1
2
4
6
7
8
9
10
11
12
13
14
15
16
18
19
20
21
22
24
25
26
--更多--

c程序中使用正则

在这里插入图片描述regcomp()函数–编译正则表达式

int regcomp(regex_t *compiled, const char *pattern, int cflags);

【作用】:这个函数把指定的正则表达式pattern编译成一种特定的数据格式compiled,这样可以使匹配更有效。函数regexec 会使用这个数据在目标文本串中进行模式匹配。执行成功返回0。

【参数说明】:
regex_t 是一个结构体数据类型,用来存放编译后的正则表达式,他的成员re_nsub用来存储正则表达式中的子正则表达式的个数。
pattern指向要编译的正则表达式字符串。
cflag有以下四个值:
REG_EXTENDED:以功能更加强大的扩展正则表达式的方式进行匹配。
REG_ICASE: 匹配字母时忽略大小写。
REG_NOSUB: 不用存储匹配后的结果。
REG_NEWLINE: 识别换行符,这样’$’就可以从行尾开始匹配,’^’就可以从行的开头开始匹配

3、regexec()函数–匹配正则表达式

int regexec (regex_t *compiled, char *string, size_t nmatch, regmatch_t matchptr [], int eflags)

【作用】:可以用regexec 匹配我们的目标文本串了,如果在编译正则表达式的时候没有指定cflags的参数REG_NEWLINE,则默认情况下是忽略换行符的,也就是把整个文本串当作一个字符串处理。执行成功返回0。

【参数说明】:
compiled 是regcomp函数编译好的正则表达式。
string 是目标串。
nmatch 是regmatch_t结构体数组的长度。
matchptr regmatch_t类型的结构体数组,存放匹配文本串的位置信息。
eflags 有两个值 :REG_NOTBOL,REG_NOTEOL 。

4、regfree()函数–释放正则表达式

void regfree (regex_t *compiled)

【作用】:当使用完编译好的正则表达式后,或者要重新编译其他正则表达式的时候,我们可以用这个函数清空compiled指向的regex_t结构体的内容,如果是重新编译的话,一定要先清空regex_t结构体。
5、regerror()函数

size_t regerror (int errcode, regex_t *compiled, char *buffer, size_t length)

【作用】当执行regcomp 或者regexec 产生错误的时候,就可以调用这个函数而返回一个包含错误信息的字符串。

【参数说明】:
errcode 是由regcomp 和 regexec 函数返回的错误代号。
compiled 是已经用regcomp函数编译好的正则表达式,这个值可以为NULL。
buffer 指向用来存放错误信息的字符串的内存空间。
length 指明buffer的长度,如果这个错误信息的长度大于这个值,则regerror 函数会自动截断超出的字符串,但他仍然会返回完整的字符串的长度。所以我们可以用如下的方法先得到错误字符串的长度。

6、regmatch_t 结构体

typedef struct
{
   regoff_t rm_so;
   regoff_t rm_eo;
} regmatch_t;

【成员变量】:

成员rm_so 存放匹配文本串在目标串中的开始位置;
rm_eo 存放结束位置;

【注】:通常我们以数组的形式定义一组这样的结构。因为往往我们的正则表达式中还包含子正则表达式。数组0单元存放主正则表达式位置,后边的单元依次存放子正则表达式位置。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值