shell之正则表达式

2023-05-16

一 正则表达式

正则表达式:描述某些字符串匹配规则的工具

使用原因:程序设计过程中不可避免的遇到处理某些文本情况,有时候要查找符合某些比较复杂规则的字符串。正则表达式以非常简单的代码完成。

常见的支持正则表达式的UNIX工具:

grep命令族:用于匹配文本行

sed流编辑器:用于改变输入流

awk:用于处理字符串的语言

more或者less等:文件查看程序

ed,vi或者vim等:文本编辑器

实践正则表达式:

#! /bin/bash

str=`catversion.txt|grep rev`

echo"$str"

cat命令用来显示文本内容,竖线是管道,表示将cat命苦的输出结果作为后面的那个命令的输入,grep命令用来查找文本,rev指要匹配的字符串。上面执行结果表示version.txt文件中的某一行含义rev这个字符串,实际上,grep命令后面的参数可以换成任意的正则表达式)

1.1 正则表达式原理

正则表达式是对文本进行过滤的工具,之所以有过滤文本的功能,因为它定义了一系列的元字符,通过元字符配合其他字符来表达出一种规则。只有符合该规则的文本才能保留下来。

元字符:描述字符的字符。

元字符作用:对表达式的内容,转换以及各种操作信息进行描述。


 1.2  基本正则表达式

又称标准正则表达式,仅支持最基本的元字符集。

基本正则表达式定义的元字符主要有:

 1)行首定位符 “^”

用来匹配行首的字符。表示行首的字符是^后面的那个字符。

行首定位符位于所作用的字符之前

例如:

#列出/etc目录中的以字母po开头的文件名

str=`ls /etc |grep "^po"`

echo"$str"

^po理解为第一个字符为p,紧跟着一个字母o的文本行。不要理解为字符串po开头的文本行。)      

 2)行尾定位符”$”

作用:定位文本行的末尾。

行尾定位符位于所作用的字符之后。

#列出/etc目录中以conf结尾的文件名

str=`ls /etc |grep "conf$"`

echo"$str"

结果:anthy-conf

       asound.conf

 注意:

精确匹配一个文本行:^cat$ 完全匹配cat的文本行

^$:匹配所有空行

单独的^$没有任何意义,因为任何一个文本行都有开头和结尾。

 3)单个字符匹配”.”

圆点.用来匹配任意单个字符。包括空格,但不包括换行符\n。当使用”.”后,意味着该位置一定有一个字符,无论他是什么字符。

例:

#列出所有的包含字符串“samba”的文件名,不管samba后面有没有字符

str=`ls /etc |grep "samba"`

echo"$str"

echo"==============================="

#列出包含字符串samba,且samba后面只是含义一个字符

str=`ls /etc |grep "samba."`

echo"$str"

结果:samba

      samba4

======================

samba4

(可以连续使用..来匹配多个字符,如l..p,匹配含义字母l,然后是两个任意字符,再接着是字母p的字符串)       

 4) 限定符“*”

限定符本身不代表任何字符,用来指定其前面的一个字符必须重复出现多次才能满足匹配。而星号表示匹配其前导字符的任意次数,包括0

#筛选出以字符s开头,紧跟着1个字符s,再接着任意个字符s的文件名

str=`ls /etc |grep "^sss*"`

echo"$str" 

结果:ssh

        ssl

        sssd

 5) 字符集匹配“[]”

只要某个字符串在方括号所在的位置上出现了方括号中的任意一个字符,就满足匹配规则。

对于连续的数字或字母,可使用连字符-来表示一个范围。

如:[a-f]表示匹配af中的任意一个字母

[0-9]匹配任意单个数字

#筛选所有以字符r开头,并且紧跟着1个字符c的文本行

str=`ls /etc |grep "^rc"`

echo "$str"

echo "=============================="

#筛选所有以字符r开头,紧跟着1个字符为c,下面1个字符为单个数字的文本行

str=`ls /etc | grep "^rc[0-9]"`

echo "$str"

 6)字符集不匹配“[^]”

 1.3  扩展正则表达式

(egrep命令默认使用扩展正则表达式)

1 )限定符“+”

+”限定前面的字符至少出现一次。

#筛选以字符串“ss”开头,后面至少紧跟着1个字符“s”的文本行

str=`ls /etc |egrep "^sss+"`

echo"$str"

结果:sssd

 2)限定符“?”

限定前面的字符最多只出现一次。

#筛选以字符串“ss”开头,后面跟着0或者1s的文本行

str=`ls /etc |egrep "^sss?"`

echo"$str"

结果:ssh,ssl,sssd

 3)竖线“|”和圆括号“()”

竖线|表示多个正则表达式之前或的关系

圆括号表示一组可选值得集合。

竖线和圆括号经常一起使用,表示一组可选值。

#筛选含有字符串“ssh”、“ssl”或者以字符串“yum”开头的文本行

str=`ls /etc |egrep "(ssh|ssl|^yum)"`

echo"$str"

1.4 Perl正则表达式

1)数字匹配\d

2)非数字匹配\D

3)空白字符匹配\s

4)非空白字符匹配\S

1.5正则表达式应用

匹配单个字符

1 单个一般字符

英文字符,数字,空白字符以及标点符号

#搜索demo2.txt含有字符“a”的文本行

str=`grep"a" demo2.txt`

echo"$str"

 2 转义后的元字符

要匹配元字符本身,需要在这些字符的前面加上\,关闭这些元字符的特殊意义,保留其字面意义。

反斜线也是一个元字符,如果要匹配,也要加\,即表达式“\\”表示匹配一个反斜线。

 3 方括号表达式

当元字符位于方括号中时,除了连字符-或者^之外,其他元字符都会失去特殊意义。如:

[\.]表示的是反斜线\和圆点.这两个字符。如果要匹配圆点,[.]就可以了。

 

匹配多个字符

1 将多个字符按照指定顺序拼接起来

#搜索字符串“matter

str=`grep"matter" demo3.txt`

echo"$str"

2 方括号或星号等配合

#匹配任意多个字符“o

str=`grep"lo*king" demo3.txt`

echo"$str"

例子:筛选符合指定格式的电话号码

#筛选符合格式的电话号码

str=`egrep"800-[[:digit:]]{3}-[[:digit:]]{4}$" demo4.txt`

echo"$str"

 1.6 正则表达式优先级

\   转义符

[]  方括号表达式

()   分组

*,+?{m},{m,}{m,n}  限定符

普通字符  从左到右顺序

^,$ 定位符

|   或运算

(从高到低)

 

1.7 子表达式

由多个普通字符或者元字符组成的一个小的正则表达式。作为一个大的正则表达式的一部分使用,不能单独使用。使用圆括号括起来。

例子:匹配IP地址

#匹配IP地址

str=`egrep"^([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}$" ip.txt`

echo"$str"

(子表达式表示匹配1-3个数字,然后是一个圆点。整个表达式描述的字符串以3组重复的1-3个数字后跟一个圆点开头,然后以1-3个数字结尾)

精确匹配IP地址:

#匹配正确IP地址

str=`egrep"^([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])$"ip.txt`

echo"$str"

 1.8 通配符

shell本身不支持正则表达式,使用正则表达式的是shell命令和工具。

shell使用了正则表达式中的某些元字符作为通配符,常用的有*,?,[],{},^等。但意义有所不同。

如:*表示匹配任意的字符,在非正则表达式中限制其前导字符的0次或多次重复。

例:

列出以ex开头的当前目录中所有的文件:ls–l ex*

列出以字符de开头的文件:ls –l [de]*

1.9 grep命令

grep命令使用正则表达式来搜索文本,并且把匹配的文本打印出来

grep [options]pattern [file]

option表示选项,pattern表示匹配的模式。file表示一系列文件名。

常用选项:

-c  只打印匹配的文本行的函数,不显示文本内容。

-i   匹配时忽略字母大小写

-h  当搜索多个文件,不显示匹配文件名前缀。

-l   只列出含义匹配的文本行的文件的文件名,不显示其具体匹配的内容。

-n  列出所有匹配的文本行,并显示行号

-s   不显示关于不存在或无法读取文件的错误信息

-v   只显示不匹配的文本行。

-w  匹配整个单词

-x   匹配整个文本行

-r   递归搜索,不仅搜索当前目录,还有各级子目录

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

shell之正则表达式 的相关文章

  • 使用正则表达式模式查找 -name 并使用 cp 替换文件名

    目前我正在使用该命令cron复制 data从源到目标路径 find source path name data exec cp target path 源码结构为 source path category1 001 data source
  • shell-out 值到 md5(加密)函数

    我正在寻找一种解决方案 我正在构建 JSON 记录 并需要在 JQ 中生成一些文本 但将此文本通过管道传输到 MD5 求和函数并将其用作键的值 echo first John last Big jq id first last md5 通过
  • 当 grep "\\" XXFile 我得到“尾随反斜杠”

    现在我想查找是否有包含 字符的行 我试过grep XXFile但它暗示 尾随反斜杠 但当我尝试时grep XXFile没关系 谁能解释一下为什么第一个案例无法运行 谢谢 区别在于 shell 处理反斜杠的方式 当你写的时候 在双引号中 sh
  • 通过 sed 使用 unix 变量将数据附加到每行末尾[重复]

    这个问题在这里已经有答案了 我有一个文件 我想使用 SED 将值附加到每行末尾的 unix 变量中 我已经通过 AWK 实现了这一点 但我想在 SED 中实现 像这样的东西 我已经尝试过以下命令 但它不起作用 sed i s BATCH R
  • Shell 脚本中的块注释

    有没有一种简单的方法可以注释掉 shell 脚本中的代码块 In bash bin bash echo before comment lt lt END bla bla blurfl END echo after comment The a
  • npm 运行如何工作?

    当我打字时会发生什么npm run
  • GNU 并行与 rsync

    我正在尝试运行一些实例rsync并行使用ssh with GNU parallel 我正在运行的命令是这样的 find tmp tempfolder type f name chunck sort parallel gnu j 4 v ss
  • 如何在Shell脚本中解析字符串

    我想在 shell 脚本中解析以下字符串 VERSION 2 6 32 54 0 11 def 这里我想得到两个值 first 263254 second 11 我使用以下方法来获取第一个值 first expr substr VERSIO
  • Bash - 比较 2 个文件列表及其 md5 校验和

    我有 2 个列表 其中包含带有 md5sum 检查的文件 即使文件相同 列表也具有不同的路径 我想检查每个文件的 md5 和 我们正在讨论数千个文件 这就是为什么我需要脚本来仅显示差异 第一个列表是普通列表 第二个列表是文件的当前状态 我想
  • 比较linux中的两个未排序列表,列出第二个文件中的唯一项

    我有 2 个包含号码列表 电话号码 的文件 我正在寻找一种列出第二个文件中第一个文件中不存在的数字的方法 我尝试过各种方法 comm getting some weird sorting errors fgrep v x f second
  • PHP exec rm -Rf 不适用于子目录

    我试图删除特定文件夹中的所有内容 但它似乎不会影响子文件夹 但它应该 因为 bash 命令是从控制台执行的 system rm Rf some dir 该命令中不需要星号 如果要与文件一起删除目录 请同时删除斜杠 留下斜杠将删除文件 但保留
  • 查找并删除超过 x 天的文件或文件夹

    我想删除超过 7 天的文件和文件夹 所以我尝试了 17 07 14 email protected cdn cgi l email protection find tmp mindepth 1 maxdepth 1 ctime 7 exec
  • Python 子进程:无法转义引号

    我知道以前曾问过类似的问题 但它们似乎都是通过重新设计参数的传递方式 即使用列表等 来解决的 但是 我这里有一个问题 因为我没有这个选项 有一个特定的命令行程序 我使用的是 Bash shell 我必须向其传递带引号的字符串 它不能不被引用
  • 通过 Node.js 运行 bash 脚本 - 非法选项 -o pipelinefail

    我正在尝试使用 Node js 执行 bash 脚本child process exec 然而它在文件的第二行爆炸 usr bin env bash set eo pipefail TRACE set x echo we are here
  • Ruby 在特定目录中运行 shell 命令

    我知道如何在 Ruby 中运行 shell 命令 例如 x cmd 但是 如何指定运行此命令的目录 有没有类似的脱壳方式 类似subprocess Popen在Python中 subprocess Popen r c mytool tool
  • 将 apache documentRoot 设置为符号链接(以便于部署)

    我们正在寻找一种将 Apache DocumentRoot 指向符号链接的方法 例如 文档根目录 var www html finalbuild Finalbuild 应该指向 home user build3 之类的文件夹 当我们将新构建
  • Unix shell脚本找出脚本文件所在的目录?

    基本上我需要使用与 shell 脚本文件位置相关的路径运行脚本 如何将当前目录更改为与脚本文件所在的目录相同 在 Bash 中 你应该得到你需要的东西 如下所示 usr bin env bash BASEDIR dirname 0 echo
  • 如何隐藏显示终端命令输出

    当我运行这个命令时 sudo htpasswd b home reynolds htpasswd admin admin 我正在得到输出Updating password for user admin在终端中 但我不想显示该输出 所以我在谷
  • 在 NodeJS 中运行 Conda 命令

    我无法使用以下命令运行 C onda 命令exec与我的 NodeJS 应用程序 var conda path miniconda3 bin conda var cmd conda path init bash conda path act
  • 在bash中用其他文件过滤一个文件

    我有一个带有数字的文件 例如 cat file 31038467 32048169 33058564 34088662 35093964 31018168 31138061 31208369 31538163 31798862 和其他例如

随机推荐

  • 基于安卓AndroidStudio校园求职招聘app设计

    开发软件 xff1a Eclipse Idea 43 Android Studio 43 mysql 这是一个基于AndroidStudio前后端分离开发的校园大学生求职招聘app 后端使用java语言的Springboot框架开发 xff
  • 气压计MS5611

    经过几天的痛苦挣扎 终于搞定了 完成气压计的参数读写 xff0c 温度检测 xff0c 大气压计算 因为这款气压计精度高 xff0c 好多计算需要用到正负数 xff0c 整数小数 xff0c 浮点整形 xff0c 有的计算结果特别大 xff
  • Android 序列化Parcelable的使用详解

    背景 xff1a 在Java虚拟机中 xff0c 对象的传递称为数据传递不可或缺的一部分 xff0c 但如果一旦虚拟机停止工作 xff0c 该对象在内存中也就被释放 xff0c 地址空间不存在 xff0c 对象自然就不能再被重复利用 xff
  • 口袋云台拆机微型防抖云台硬件结构解析拆机硬件结构开源云台svpwm控制simple云台storm防抖原理陀螺仪多旋翼吊舱飞控无刷电机FOC

    口袋云台拆机微型防抖云台硬件结构 18大疆发布了众所周知的osmo packet xff0c 其微小的体积和卓越的性能让用户爱不释手 虽然现已是2020年 xff0c 各大厂商都争先推出相关竞品 xff0c 大疆凭借强大的技术后盾产品力自然
  • 开启Java8来启用Lambda表达式在Android Studio的一些配置

    欢迎使用Markdown编辑器写博客 本Markdown编辑器使用StackEdit修改而来 xff0c 用它写博客 xff0c 将会带来全新的体验哦 xff1a Markdown和扩展Markdown简洁的语法代码块高亮图片链接和图片上传
  • IPQ4019/QCA9531/MT7628/MT7621系嵌入式无线双频AP核心模块选型探讨

    嵌入式双频无线AP核心模块 首先是核心模块 不是成品主板 也可以认为是成品的核心部分 xff0c 或者理解成只带方便延伸的接口功能 xff0c 不带外围实际接口的成品 xff0c 实际使用时 xff0c 可以根据所需要的接口灵活选择 未必要
  • nginx为什么是多进程单线程和多路IO复用模型

    Nginx现在是非常火爆的web服务器 xff0c 她使用更少的资源 xff0c 支持更多的并发连接数 xff0c 她实现了linux的epoll模型 xff0c 能够支持高达 50 000 个并发连接数的响应 Nginx采用的是多进程单线
  • python函数变量和内置函数

    一 函数的作用域 1 全局变量 xff1a 函数外部定义的变量 xff1a 叫做全局变量 xff0c 全局变量顾名思义就指定不管是函数内部还是函数外部都能够访问 2 局部变量 xff1a 局部变量 xff0c 就是在函数内部定义的变量 xf
  • vector erase删除第几个

    vector lt int gt Ilist Ilist push back 1 Ilist push back 2 Ilist push back 3 Ilist push back 4 Ilist push back 5 Ilist e
  • GLEW_ERROR_NO_GL_VERSION missing GL version一种解决方法

    可能你在代码里面指定了 GLFW 的版本号 xff0c 代码如下 xff1a glfwWindowHint GLFW CONTEXT VERSION MAJOR 4 glfwWindowHint GLFW CONTEXT VERSION M
  • have datatype/md5sum 相关的错误 IndentationError: unexpected indent

    类似的错误信息如下 xff1a ERROR 1611906790 607272604 Client listener 5059 456439 wants topic move base simple goal to have datatyp
  • 运行错误 terminate called without an active exception

    运行错误 xff1a terminate called without an active exception xff0c 可能的原因 xff1a 下面的代码中的 t41 join t42 join t43 join 注释掉会出现这个错误
  • link error : undefined reference to `main‘

    今天发现一个编译错误 xff1a undefined reference to 96 main 39 xff0c 意思是main函数没有定义 xff0c 明明定义了啊 xff0c 结果发现main函数被namespace包起来了 xff0c
  • dtsi编译错误

    1 FATAL ERROR Unable to parse input tree DTC arch arm64 boot dts rockchip rk3568 evb1 ddr4 v10 dtb Error arch arm64 boot
  • 理解dtsi中的&

    1 dtsi中的 amp 怎么理解呢 可以把它理解引用 xff0c 因为dtsi中的每个模块 xff08 驱动程序 xff09 都是用 xff5b xff5d 包在内的 xff0c 所以当你要修改某个模块A时 xff0c 可以不直接在它定义
  • 根据用户IP抓取MEC地址

    package com ccit web recommonedCode dao impl import java io BufferedReader import java io InputStreamReader import java
  • 说一说 RTThread 系统 开发过程的坑。。。

    1 系统文件 与 ST 官方的不一致 xff0c 无法兼容Cube MX xff0c 导致用户自行开发 外设时 需要大量初始化工作 xff0c 而且遇到问题难以查找 原因 xff0c 因为系统初始化过程 与官方差异较大 xff0c 这点 入
  • 几种2.4G无线数传模块电路

    一 几种2 4G无线数传模块介绍 无线数传按传输速率区分 分为低速数传模块和高速数传模块两大类 低速数传模块 使用的载频均较低 xff0c 一般都在 315MHz 433MHz 和 915MHz 这几个频段 xff0c 所以一般最高传输速率
  • 自动控制之PID原理

    自动控制原理 从控制的方式看 xff0c 自动控制系统有闭环和开环两种 闭环控制 xff1a 闭环控制也就是 xff08 负 xff09 反馈控制 xff0c 原理与人和动物的目的性行为相似 xff0c 系统组成包括传感器 xff08 相当
  • shell之正则表达式

    一 正则表达式 正则表达式 xff1a 描述某些字符串匹配规则的工具 使用原因 xff1a 程序设计过程中不可避免的遇到处理某些文本情况 xff0c 有时候要查找符合某些比较复杂规则的字符串 正则表达式以非常简单的代码完成 常见的支持正则表