本文出自:http://xuegodlinux.blog.51cto.com/10844319/1713884

一、正则表达式概念

正则表达式,又称正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。

是指一个用来描述或者匹配一系列符合某个句法规则的字符的那个字符串。

用某种模式去匹配一类字符串。

1.格式

使用grep

-v 不匹配

-n 显示行号

【例】

[root@xuegod63 tmp]# grep -n 'w[oa]rld' a.txt #查看a.txt中包含world或warld的行并显示行号

[root@xuegod63 tmp]#grep -v "<!--" b.xml #查看b.xml不包含注释的部分


2.正则表达式中特殊字符

1) ^word:待搜寻的字符串(word)在行首

搜寻“root”开始的行:

【例】

[root@xuegod63 tmp]# grep ^root passwd

root:x:0:0:root:/root:/bin/bash


2) word&:待搜寻的字符串(word)行尾

【例】

[root@xuegod63 tmp]# grep bash$ passwd


3) “\”去除特殊符号的特殊意义

【例】搜寻包括单引号 '的行,并把行号也打印出来

[root@xuegod63 tmp]# grep -n --color \' /tmp/passwd

8:halt:x:7:0:'halt':/sbin:/sbin/halt

9:'mail':x:8:12:mail:/var/spool/mail:/sbin/nologin


4) “*”重复零个到无穷多个的前一个字符

搜寻包括sp,后面o重复2次以上的行。 记得要写两个o

[root@xuegod63 tmp]# grep spoo* passwd --color


5) [list]:字符集合,里面列出想要选择的字符

搜寻包括ga或者go的行:

[root@xuegod63 test]# grep g[ao] passwd --color

games:x:12:100:games:/usr/games:/sbin/nologin

gopher:x:13:30:gopher:/var/gopher:/sbin/nologin


6) 搜寻不以#号开头的行

[root@xuegod63 tmp]# grep ^[^#] /tmp/passwd


7) [n1-n2]:字符集合的,里面列出想要包括的字符范围

搜寻含有数字的3和4的行:

[root@xuegod63 tmp]# grep [3-4] passwd �color

搜寻含有数字的行:


[root@xuegod63 tmp]# grep [0-9] passwd --color

找出开始为小写字母的

[root@xuegod63 tmp]# grep ^[a-z] passwd

开始为大定写字母:

[root@xuegod63 tmp]# grep ^[A-Z] passwd

Mk2:x:502:500::/home/mk:/bin/bash

Mk3:x:503:500::/home/mk:/bin/bash

那如果我不想要开头是英文字母: ^[^#]

[root@xuegod63 tmp]# grep ^[^a-zA-Z] passwd

显示空白行及行号:

[root@xuegod63 tmp]# grep -n ^$ passwd

正则表达式中。“.”代表绝对有一个任意字符的意思;而“*”代表重复前一个字符到无穷次的意思。 任长度的字符表示方法: .*

寻找包括有r开头和t结束且长度为四个字符行:

[root@xuegod63 tmp]# grep r..t passwd --color

寻找oo,ooo,oooo 等等的数据,也就是说,至少要有两个o 以上:

[root@xuegod63 tmp]# grep ooo* passwd --color

寻找包括g开头和g结束的字符串,中间可有可无

grep ^g.*g passwd --color


二、BRE和ERE的区别

Linux正则表达式(Regular Expression)主要遵从POSIX标准。POSIX有两种风格的正则表达式:基本正则表达式(BRE)与扩展正则表达式(ERE)。

1 “\” 两者都可 指关闭或打开后续字符的特殊意义。

2 “*” 两者都可 匹配单个字符,null(空值)除外。

3 “*” 两者都可 指匹配*之前单个字符的任意次(N>=0)。但是*在开头时,ERE中的意义为匹配空字符任意次,相当于没有*。在BRE中写在开头就表示*这个字符。

4 “^” 两者都可 匹配^后面的正则表达式或字符串,从行首匹配。但在BRE中,只有放在表达式的开头才有特殊意义。如:grep ‘^a^b^c’ test.sh 会匹配出行首为a^b^c的行,不匹配123a^b^c的行。在ERE中,^放在表达式的任何位置都有意义。如:grep ‘^a^b^c’ test.sh 不匹配任何字符。

5 “$” 两者都可 匹配&前面的正则表达式或字符串。不同点同^。

6 “[…]”两者都可 方括号表达式,中间用-连接。^在[…]中表示相反。如:grep [^a-z] test.sh 指的是除所有有小写字母的行。

7 “\{m,n\}” BER 为区间表达式,匹配表达式前至少m次,至多n次。

8 “\(\)” BER 为组合表达式,最多有9个这样的子模式,格式例如‘\(ab\)#\(ab\)#’

n 为第几个小括号这里n值为1或2。其中#为表达式

例1:

[root@xuegod63 tmp]# grep '\(['dbw']\)' 1.sh �color #匹配dbw中任意一个字符任意次

dw

dbwidb

[root@xuegod63 tmp]# grep 'dbw' 1.sh --color #只匹配出dbw连续的字符串

dbwidb

例2:

[root@xuegod63 tmp]# grep '\(ab\)\{0,1\}\(ac\)*\(ad\).*\3' 1.sh --color

ab ac ad ad ad ad

abacadadadadadcwe ad

可以得出组合表达式的通式为:ab#ac#ad#ad#ad#。。。。

9 “{m,n}”ERE 用法同BRE。

10 “+” ERE 匹配其前面表达式>=1次

11 “?” ERE 匹配前面表达式<=1次

12 “|” ERE 匹配前或后的表达式

13 “()” ERE 匹配小括号里的表达式群

说明:10到13 四个符号都要求前面或后面为表达式,如果没有 则特殊含义将跳过,

“?+”等价于“*”。

三、sed

strem editor 流编辑器

sed编辑器是一行一行的处理文件内容的。正在处理的内容存放在模式空间(缓冲区)内,处理完成后按照选项的规定进行输出或文件的修改。

sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;

1.语法

sed [options] ‘[command]’ [filename]

[root@xuegod163 ~]# sed 's/root/rm/' /etc/passwd > newfilename

wKioL1aA6y7gHG48AACO5Uf3Dmc623.png

options:

-n抑制自动(默认的) 输出 *** 读取下一个输入行

-e执行多个sed指令

-f运行脚本

-i编辑文件内容 ***

-i.bak编辑的同时创造.bak的备份

-r使用扩展的正则表达式 ***

command:

a在匹配后追加 ***

i在匹配后插入 ***

p打印 ***

d删除 ***

r/R读取文件/一行

w另存

s查找

c替换

y替换

h/H复制拷贝/追加模式空间(缓冲区)到存放空间

g/G粘贴 从存放空间取回/追加到模式空间

x两个空间内容的交换

n/N拷贝/追加下一行内容到当前

D删除\n之前的内容

P打印\n之前的内容

b无条件跳转

t满足匹配后的跳转

T不满足匹配时跳转

【例】

1)显示文件第三行

[root@xuegod63 tmp]# sed -n '3p' passwd

daemon:x:2:2:daemon:/sbin:/sbin/nologin

2)显示文件前三行

[root@xuegod63 tmp]# sed -n '1,3p' passwd

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

3)显示文件除前三行之外的全部内容

[root@xuegod63 tmp]# 显示文件第三行和之后的三行

[root@xuegod63 tmp]# sed -n '3,+3p' passwd

5)在文件头插入“###”

[root@xuegod63 tmp]# sed '1i###' passwd > a.txt

6)在文件尾插入"@@@"

[root@xuegod63 tmp]# sed '$a@@@' passwd > a.txt

7)把文件第三行替换成“$$$”

[root@xuegod63 tmp]# sed '3c$$$' passwd

8)复制粘贴

把文件的第二行到第四行复制到文件的末尾

[root@xuegod63 tmp]# sed '2,4H;$G' passwd > b.txt

h/G粘贴 从存放空间取回/追加到模式空间

2.sed中的正则

^ $ . *

【例】

1)删除空行 d删除 ***

[root@xuegod63 tmp]# sed '/^$/d' passwd > c.txt

2)把fstab中包含ext4的记录(行)写入新的文件中

[root@xuegod63 tmp]# sed '/ext4/w newfstab2' /etc/fstab

四、awk

1 说明

AWK是一种优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言的最大功能取决于一个人所拥有的知识。awk命名:Alfred Aho Peter Weinberger和brian kernighan三个人的姓的缩写。

最简单地说, AWK 是一种用于处理文本的编程语言工具。

任何awk语句都是由模式和动作组成,一个awk脚本可以有多个语句。模式决定动作语句的触发条件和触发时间。

2 特殊字段

BEGIN语句设置计数和打印头部信息,在任何动作之前进行。

END语句输出统计结果,在完成动作之后执行。

3 分隔符

默认是空格可以用-F,改变成逗号为分隔符 -F,或改成冒号 -F:

4 安装软件

[root@xuegod63 tmp]# rpm -qf `which awk`

gawk-3.1.7-6.el6.x86_64

[root@xuegod63 tmp]# rpm -qf `which sed`

sed-4.2.1-7.el6.x86_64

【例】准备要显示的内容:

#vim result.txt

andy 4 85 92 78 94 88

bob 6 89 90 75 90 86

claire 9 84 88 80 92 84

dave 5 94 52 84 86 NA

1)自定义年月日的显示方式:

Year:2015month:Febdays:11

[root@xuegod63 tmp]# date | awk '{print "Year:"$6 "\t month:"$2 "\t days:"$3}'

Year:2015 month:Feb days:11

2)显示所有内容:

#awk '{print $0}' result.txt

3)显示第一行,以:作为分隔符

[root@xuegod63 tmp]# awk -F: '{ print $1 }' /etc/passwd

4)显示第一列和第三列的内容。

[root@xuegod63 tmp]# awk '{print $1,$3}' result.txt

andy 85

bob 89

claire 84

dave 94

5)打印一个文件头,打印一个文件尾

特殊字段:

BEGIN语句设置计数和打印头部信息,在任何动作之前进行。

END语句输出统计结果,在完成动作之后执行。

[root@xuegod63 tmp]# awk 'BEGIN {print "name level result\n"} {print $1,$2,$3} END{ print "end of class1 results"}' result.txt

name level result

andy 4 85

bob 6 89

claire 9 84

dave 5 94

end of class1 results

6)第二列大于等于5的那些记录

[root@xuegod63 tmp]# awk '$2 >= 5 {print $0}' result.txt

bob 6 89 90 75 90 86

claire 9 84 88 80 92 84

dave 5 94 52 84 86 NA

7)显示用户名为andy或(和)第二列为9的记录

[root@xuegod63 tmp]# awk '{ if($1 == "andy" || $2=="9") print $0 }' result.txt

[root@xuegod63 tmp]# awk '{ if($1 == "andy" && $2=="9") print $0 }' result.txt

【学神】 1-20正则表达式以及sed、awk的使用的更多相关文章

  1. Html5 canvas实现粒子时钟的示例代码

    这篇文章主要介绍了Html5 canvas实现粒子时钟的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. HTML5数字输入仅接受整数的实现代码

    这篇文章主要介绍了HTML5数字输入仅接受整数的实现代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. ios – 使用大写符号在字符串swift中获取URL的正则表达式

    我尝试在文本中获取URL.所以,在此之前,我使用了这样一个表达式:但是当用户输入带有大写符号的URL时(例如Http://Google.com,它与它不匹配)我遇到了问题.我试过了:但什么都没发生.解决方法您可以使用正则表达式中的i内联标志关闭区分大小写,有关可用正则表达式功能的详细信息,请参阅FoundationFrameworkReference.(?ismwx-ismwx)Flagsetti

  4. 在Xcode4中,你可以更改用于显示隐形字符的字符吗?

    我更喜欢VisualStudio显示隐形的方式……

  5. ios – 应用程序商店描述特殊字符

    是不是可以在AppStore描述中使用像星星这样的特殊字符了?我得到这个错误:描述不得包含标记语言.说明不得包含以下字符:★提前致谢:)解决方法仍然允许一些unicode字符.以下字符已经过测试并仍然有效:◆√至于现在他们工作正常,但苹果可以随时再次改变条件.

  6. ios – 将数组中的字符转换为整数

    即使我搜索了文档,我似乎无法弄清楚如何做到这一点.我试图弄清楚如何将数组中索引处的字符转换为整数.例如,假设我有一个名为“容器”的字符数组,我无法弄清楚该怎么做:谢谢您的帮助!解决方法Swift并不容易在原始和类型表示之间进行转换.这是一个在此期间应该有所帮助的扩展:这使您可以非常接近您想要的:对于遇到此问题的任何工程师,请参阅rdar://17494834

  7. macos – 运行brew命令充满了’同意Xcode / iOS许可证需要管理员权限,请通过sudo以root身份重新运行.’

    所以我跑了:如果滚动到底部,可以输入“同意”,然后就可以了.

  8. ios – 如何在Swift 3中使用正则表达式?

    解决方法我相信.当没有其他选项适用时,将使用.allZeros.因此,使用Swift3,您可以传递一个空的选项列表或省略options参数,因为它默认为无选项:要么请注意,在Swift3中,您不再使用error参数.它现在抛出.

  9. ios – lldb断点在类目标c中的所有方法

    如何使用lldb在ObjectiveC类中的所有方法上自动设置断点?

  10. ios – 创建一个包含n个空格或其他重复字符的字符串

    我想使用Swift使用n个空格进行字符串,但不使用for循环或手动如下所示:解决方法String已经有一个repeating:count:initializer就像Array(和其他采用RangeReplaceableIndexable协议的集合):所以你可以打电话:请注意,重复的参数是一个字符串,而不仅仅是一个字符,因此您可以重复整个序列:编辑:更改为Swift3语法,并删除了关于Swift1类

随机推荐

  1. 法国电话号码的正则表达式

    我正在尝试实施一个正则表达式,允许我检查一个号码是否是一个有效的法国电话号码.一定是这样的:要么:这是我实施的但是错了……

  2. 正则表达式 – perl分裂奇怪的行为

    PSperl是5.18.0问题是量词*允许零空间,你必须使用,这意味着1或更多.请注意,F和O之间的空间正好为零.

  3. 正则表达式 – 正则表达式大于和小于

    我想匹配以下任何一个字符:或=或=.这个似乎不起作用:[/]试试这个:它匹配可选地后跟=,或者只是=自身.

  4. 如何使用正则表达式用空格替换字符之间的短划线

    我想用正则表达式替换出现在带空格的字母之间的短划线.例如,用abcd替换ab-cd以下匹配字符–字符序列,但也替换字符[即ab-cd导致d,而不是abcd,因为我希望]我如何适应以上只能取代–部分?

  5. 正则表达式 – /bb | [^ b] {2} /它是如何工作的?

    有人可以解释一下吗?我在t-shirt上看到了这个:它似乎在说:“成为或不成为”怎么样?我好像没找到’e’?

  6. 正则表达式 – 在Scala中验证电子邮件一行

    在我的代码中添加简单的电子邮件验证,我创建了以下函数:这将传递像bob@testmymail.com这样的电子邮件和bobtestmymail.com之类的失败邮件,但是带有空格字符的邮件会漏掉,就像bob@testmymail也会返回true.我可能在这里很傻……当我测试你的正则表达式并且它正在捕捉简单的电子邮件时,我检查了你的代码并看到你正在使用findFirstIn.我相信这是你的问题.findFirstIn将跳转所有空格,直到它匹配字符串中任何位置的某个序列.我相信在你的情况下,最好使用unapp

  7. 正则表达式对小字符串的暴力

    在测试小字符串时,使用正则表达式会带来性能上的好处,还是会强制它们更快?不会通过检查给定字符串的字符是否在指定范围内比使用正则表达式更快来强制它们吗?

  8. 正则表达式 – 为什么`stoutest`不是有效的正则表达式?

    isthedelimiter,thenthematch-only-onceruleof?PATTERN?

  9. 正则表达式 – 替换..与.在R

    我怎样才能替换..我尝试过类似的东西:但它并不像我希望的那样有效.尝试添加fixed=T.

  10. 正则表达式 – 如何在字符串中的特定位置添加字符?

    我正在使用记事本,并希望使用正则表达式替换在字符串中的特定位置插入一个字符.例如,在每行的第6位插入一个逗号是什么意思?如果要在第六个字符后添加字符,请使用搜索和更换从技术上讲,这将用MatchGroup1替换每行的前6个字符,后跟逗号.

返回
顶部