当前位置:

Linux正则表达式

访客 2024-04-25 945 0

正则概念?

它是一门独立的学问,类似数学,很多应用都支持它,尤其是各种编程语言,在linux中各种工具,各种语言都支持,shell,grep,vim,sed,awk,python,php,perl,java。sed里用法和awk几乎一样。

表达式

算术表达式(12=,3>2)

正则表达式reuglarexpression文档上见的最多的是regexp。是这两个单词的缩写。

在键盘上所有能敲出的符号全都可以看做是正则表达式。只不过有的只能表示自己,表示不了别的

一类只能表示它自己

一类能表示其他的一系列字符(只要把这类记住,剩下的都表示它自己)元字符

基本元字符(基本正则)baseregexp

扩展元字符(扩展正则)extendedregexp

sed最基本最常见的用法

替换

sed-r加-r是支持扩展正则不加-r是支持基本正则

sed‘s/正则/替换之后的内容/’文件名

(中间是单引号或者双引号(单引号用的多)单引号里面是子命令,子命令就是sed可以实现的功能,比如替换,替换功能用的子命令是s语法sed‘s///’第一个//(放的是被替换的内容/正则匹配的内容)最终匹配的不是正则本身,是正则匹配到的内容后面的//是放的是替换之后的内容,最后放的是文件名

例如

[root@localhost~]#sed‘s/a/A’passwd小a换成A

[root@localhost~]#sed's/a/A/2'passwd想换第几个在加个数字

[root@localhost~]#sed's/a/A/g'passwd换所有s是替换子命令a属于正则但是a不是特殊的元字符只能表示自己,A替换后的内容g全局,一行里所有的a把g去掉是只匹配第一个字符

基本正则

.表示任意的单个字符(不包括换行\n)

sed's/./A/'a.txt每一行的第一个字符都被替换了

也可以通过管道符交给sed处理后面就不用写文件名cata.txt|sed's/../A/'

cata.txt|sed's/../A/'..两个每一行的前两个字符被替换成A

h只能表示自己h后面不管是什么都能匹配到会把h后面是某一个东西的组合换成A

h只能匹配它自己.可以匹配任意字符l只能匹配自己

to换成TOt.可以换任意字符的组合

*匹配任意多个它的前置字符或者表示它的前置字符有一个或多个(在通配符中它表示所有)

匹配的是*前面的字符a*表示a有任意多个,不是a后边有多个,表示前置字符a有0个或多个。

例子:

cata.txt|sed's/t*/A/'*匹配的是前置字符有一个或多个,除了它的前置字符,其他的看有没有特殊意义比如.任意的单个字符不管t前面是什么,只要它是字符它就匹配

cata.txt|sed's/al*/A/'

.*所有字符任意的单个字符有任意个)这个所有字符和通配符的所有字符不一样,通配符里所有字符不包括没有字符,这里包括没有。

cata.txt|sed's/.*/A/'每一行都换成了A

cata.txt|sed's/h.*o/A/'以h开头以o结尾,中间是任意字符

这是它的特性叫:贪婪匹配就像贪吃蛇一样会吞掉后面所有匹配的字符跟加不加g没关系只要能匹配到的.*全都给匹配到一直到后面截断的字符

cata.txt|sed's/h.*o/A/'不想让他贪婪匹配就想让他到第一个o加个空格

cata.txt|sed's/h.*o/A/'替换的后面加一个空格单词就不是连到一块的了

把/etc/passwd的第一列全部删掉先观察文本每一行第二列:在基本正则没有什么特殊意义只能表示它自己,可以拿:当做截断的标记。要是不截断,它会贪婪匹配到最后一个字符。

[root@localhost~]#sed's/.*:x:/:x:/'/etc/passwd

^行首

cata.txt|sed's/^/A/'在每一行的行首加一个A

cata.txt|sed's/^h/A/'以h开头的行匹配的就是h

$表示一行的结尾

cata.txt|sed's/$/A/'每一行后面加A
cata.txt|sed's/u$/A/'以u结尾的行匹配的就是u后面加A

打印出来确实发生变化,但是源文件就没变,这种操作都是临时的,如果想让他变为永久的,

重新建一个全新的文件,重定向到其他的文件里,但是不合适,到了生产环境是直接修改原文件,想直接修改原文件加-i原文件直接被改掉了.cata.txt|sed-i's/a/A/'现在是直接改文件不能用管道的方式了,cat完了之后直接是文件的内容交给sed处理的根本不是文件,是文件内容,加个-i他就不知道了修改谁保存在哪,想让他直接修改文件把a.txt放在后面不用管道了。sed-i's/a/A/'a.txt这时候就直接改了,到了公司,生产环境上要先测试刚开始不能加-I,测快成功了再加-i。

上面的所有正则表达式在过滤这一块都可以用,用法一模一样但是用扩展正则得加-e,不加只支持基本正则。

^$表示空行

sed's/^#.*//'把注释行删掉

sed-e's/^#.*//'把空行匹配一下

sed-e's/^#.*//'-e'/^$/d'/etc/vsftpd/vsftpd.conf定位

sed-e's/^#.*//'/etc/vsftpd/vsftpd.conf|grep-v'^$'

[]占位为一个字符的位置表示匹配其中任何一个能匹配到的字符

一个[]只占位为一个字符的位置,能匹配中括号里的任意一个字符

cata.txt|sed‘s/a[abcdefgh]/A/’a和其中任意一个

cata.txt|sed‘s/a[abcdrefgh][abcde]/A/’a和两个[]组合aaa

cata.txt|sed‘s/a[^abcdefgh]/A/’取反凡是,不是括号里的都匹配前提是前面有a

cata.txt|sed's/a[a-z]/A/'

[abcd]匹配其中任意一个

[^abcd]取反

[a-z]表示范围26个字母的任意一位范围里的东西一定要是连续的(也不能反向来z-a)大写的运行

[a-Z]表示52个不能反着来z-a

[^a-z]给a-z取反

[-*/]错误写法[-*/]正确写法匹配加减乘除因为-表示的是范围,把-写到前面表示的就是自己不是范围或者写后面也行[-az][az-]-匹配的是它自己

cata.txt|sed‘s/-/A’cata.txt|sed‘s/[abc-]/A’ab-ca是自己b-c范围它匹配不了-本身

[a-z]

[0-9]

[a-k]

[A-Z]

[-*/]//错误的模式

[-*/]//正确

[*/-]//正确

\(\)做分组()

\{\}

表示它的前置字符有3个

cata.txt|sed's/na\{3\}/A/'

表示它的前置字符有2到3个

cata.txt|sed's/na\{2,3\}/A/'

表示它的前置字符有2个以上

cata.txt|sed's/na\{2,\}/A/'

\转义字符把有意义的变得没意义把没意义的变得有意义

\n\t\r

\<定位词首

#catb.txt|sed's/\<nice/A/'//匹配以nice开头的单词

\>定位词尾

#catb.txt|sed's/nice\>/A/'//匹配以nice结尾的单词

#catb.txt|sed's/\<nice\>/A/'//只匹配nice

cata.txt|sed‘s/(/|/’把小括号换成|

假如文本有个h\ello想把这个\掉,先去匹配\cata|sed‘s/\\//’再加一个\,它不能表示自己,加个\转义放空就行。它本来是有意义的,基本正则,给它转义就把它原来的意义转没了。

可以换成任何符号,只要是三个,长的一样的,它会自动当成分隔符,当成///来用,这样就不会发生冲突了,/cata|sed's|/||'

cata|sed'sa/aa'平时不要这么弄,没有特殊需求的时候,第二选择就是;

扩展正则

首先使用sed的时候得让它支持扩展正则,默认是不支持的,想让它支持得加-r。

grep不加-E只支持基本正则,加了-E就支持扩展正则

()同基本正则写法不一样

{}同基本正则写法不一样

?表示它的前置字符有1个或0个(单独用的情况很少,?前面怎么也得放个东西)

表示它的前置字符有1个或多个

|a或bc或d什么或什么

cata|sed-r‘s/al?/A/’A只有第一个变了

cata|sed-r‘s/al/A/’都变成了A

cata.txt|sed-r's//A/g'号前面不光能放看得见的东西,空格也可以放
cata.txt|sed-r's/e|l/A/'想把e或者l换成A,但是只换了一个,想换所有加g

有时候文本,里有yes或者Yes

cata.txt|sed-r‘s/(y|Y)es/A’()分组把yesYes整个单词都换成A,可以用小括号分组(y|Y)es。

【注意】多看书,少熬夜。

发表评论

  • 评论列表
还没有人评论,快来抢沙发吧~