Linux正则表达式(详解)

正则概念?

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

表达式

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

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

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

一类 只能表示它自己 

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

   基本元字符(基本正则)base regexp

   扩展元字符(扩展正则)extended regexp

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处理  后面就不用写文件名 cat a.txt | sed 's/../A/'

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

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

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

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

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

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

例子:

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

cat a.txt | sed 's/al*/A/'   

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

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

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

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

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

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

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

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

 ^   行首

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

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

$   表示一行的结尾

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

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

重新建一个全新的文件,重定向到其他的文件里,但是不合适,到了生产环境是直接修改原文件,想直接修改原文件加-i原文件直接被改掉了.cat a.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 '^$'

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

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

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

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

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

cat a.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-]   -匹配的是它自己

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

[a-z]

[0-9]

[a-k]

[A-Z]

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

[-+*/] //正确

[+*/-] //正确

\(\) 做分组 ()

\{\}

表示它的前置字符有3个

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

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

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

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

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

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

\n \t \r

\< 定位词首

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

\> 定位词尾

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

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

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

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

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

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

扩展正则

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

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

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

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

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

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

|  a或b c或d  什么或什么

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

cat a | sed -r ‘s/al+/A/’   都变成了A

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

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

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

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

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
正则表达式是一种在文本中匹配、查找模式的强大工具,也是Linux操作系统中常用的工具之一。它可以用于文本处理、搜索、验证或者替换等任务。 Linux正则表达式的语法规则如下: 1. 基本字符匹配:使用普通字符直接匹配文本中的字符。 2. 元字符:元字符是具有特殊含义的字符,例如"."表示匹配除换行符外的任意字符,"*"表示匹配前面的字符零次或多次。 3. 字符类:使用方括号来定义一个字符类,方括号内的字符表示任意一个字符,例如"[abc]"表示匹配字符"a"、"b"或"c"。 4. 反向字符类:在方括号内使用"^"表示取反,例如"[^abc]"表示匹配除"a"、"b"、"c"之外的任意字符。 5. 转义字符:使用反斜杠加上特殊字符来匹配这些特殊字符本身,例如"\."匹配字符"."。 6. 重复限定符:使用重复限定符可以指定一个模式出现的次数,例如"*"表示零次或多次,"+"表示一次或多次,"?"表示零次或一次。 7. 分组:使用小括号来分组表达式,分组内的模式被当作一个整体进行处理。 8. 锚点:使用锚点可以限制匹配的位置,例如"^"表示匹配文本开头,"$"表示匹配文本结尾。 在Linux中,可以使用多个工具来处理正则表达式,例如grep、sed、awk等。grep命令是最常用的工具之一,用于在文本中搜索匹配正则表达式的行。sed命令可以用来实现对文本的编辑和转换,awk则是用于在文本中查找并处理模式的工具。 总结来说,Linux正则表达式是一种强大的在文本中匹配和处理模式的工具,掌握它可以帮助我们高效地处理文本数据。了解其基本语法规则,并熟练运用相关工具,可以提升日常工作中的效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你是我的导航

谢谢您的打赏,您的鼓励。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值