正则表达式之旅_sed_awk
谈谈正则表达式这个东西:
我想作为一个程序员,正则表达式大家绝对不陌生。
正则表达式好像一个有限则动机。主要作用是匹配,但是同时因为这个功能,我们可以扩展很多其他用法
像很多语言都引人了正则表达式:java,C#等面向对象语言,更多的是脚本语言。
另外我们常用的一些工具都引入了这个正则表达式:sed,awk,gawk,grep
包括我们的C语言,它这种引入了一部分基础的正则表达式,我们一会会见到:
正则表达式是用正则表达式引擎实现的。正则表达式引擎是解释正则表达式模式并使用这些模式进行文字或者命令匹配的底层软件
学过编译原理的都知道DFA,和NFA的概念,这是我们编译过程中语法匹配的两大模式。他们的原理和正则表达式一样。
正则表达式就是根据这样分类:我们之关注Linux
在Linux,有两种流行的正则表达式引擎:
POSIX基本正则表达式引擎(BRE)
POSIX扩展正则表达式引擎(ERE)
大多数Linux工具都至少符合BRE
下面先看一下BRE基本成分,然后看看它在不同方面的不同应用
BRE主要有一些特殊字符组成:这些特殊字符有: .*[]^${}\+?|(),下面我们一一学习:但是有一点特殊:不能直接使用单斜线(/)要用反义字符表示包括除法符号(/)
1,锚字符
行首锁定:^ 定义从数据流中文本行的行首开始的模式。只能是行首
行尾锁定:$定义了行尾锚点
两种可以匹配 使用 达到特殊的用处
2,点字符
. 用来匹配除了换行符以外的任意单字符
3,字符数组
[] 可以在此数组中定义你想匹配的任意字符也可以前后配合使用用于交叉匹配
4,排除字符组
[^] 就是字符数组的反义词,匹配的时候不匹配数组中的字符
5,区间:
[]可以用次符号表示区间 [0-9] [a-z]等等进行匹配
6,特殊字符数组:这些定义好的可以使用
[[:alpha:]] 匹配任意字母字符,不区分大小写(都包括)
[[:alnum:]] 匹配任意字母数字字符0-9,A-Z , a-z
[[:blank:]] 匹配空格或者制表符
[[:digit:]] 匹配0-9数字
[[:lower:]] 匹配小写字母
[[:print:]] 匹配可打印字符
[[:punct:]] 匹配标点符号
[[:space:]] 匹配任意空白:空格,制表符,NL,NF,VT,和CR
[[:upper:]] 匹配任意大写字母
7,星号:
在匹配文本后面表示出现0次或多次:
ERE包括一些特殊的扩展用法,awk工具能识别但是sed工具不能
1,问号
文本后面加上?,表示匹配0次或者1次
2,加号
匹配文本后加上+,表示至少匹配一次
3,化括号
(m,n)至少出现m此,最多出现n次
4,管道符号
类似or符号,任意匹配就可以
5,聚合表达式
(),用该符号表示,相当于一个准字符
下面我们来做实验,介绍正则表达式常用的地方及场景
1,sed工具
sed的全程为stream editor,俗称流编辑器。和传说中的交互式文本编辑器正好相反
语法:
sed options script file
-e script 在处理输入时,将script中指定的命令添加到运行的命令中
-f file 在处理输入时,将file中指定的命令添加到运行的命令中
-n 不要为每个命令生成输出,等待print命令来输出,起到过滤的意思
下面一一道来:
e1:
我们从这三个例子中可以看出,sed -n选项的过滤作用,可以看到sed的流处理是怎么实现的。其中s是sed流处理过程中替换的标识,后面还有很多eg:d删除,p打印等等见到再说
///一共是三个,前面两个中间是被替换的文本,后面两个中间是要替换的文本
要在sed命令行上执行多条指令,则加上-e选项就可以了,相当于前面的插入命令,中间加上“;”号,其他不正确的写法看下图
e2:
上面介绍了几种常见的正确和错误写法,其中最后一种主要是根据’号的作用,很类似python语言中的长句子(... ...)
而且还有一种现象,我们的匹配是完全的,只要有匹配的就替换,下面的从文本中读取编辑命令可以看出:
e3:
结果出来了,仔细看的就会发现。所谓完全匹配还是有一定的差别。有一个限制条件是:每行之替换一个!!!
如果我们想让它们都替换怎么办,简单,加上全集控制符就可以了/g,看它是怎么只手回天的
e4:
怎么样,控制性很高吧
sed的匹配模式语法:
s/pattern/replacement/flags
有四种可以替换标记:
>数字,标识将替换第几处匹配的地方
>g , 标识全局替换,只要出现就替换
>p ,标识原来行的内容打印出来
>w file ,将替换的结果写的文件file中
数字:
e5:
g和p:
e6:
我们从例子中可以清晰的看出区别
下面看看我们的另类一点的 写文件:
e7:
自己看,不解释,标志在感情可以接受的范围内可以用多个
另外我们发现,如果我们替换的是字符串并且字符串里面是一个路径(里面含有/)怎么办?
Look me:
e8:
我们看出了什么? 很明显,有路径必须用\符合转义。当然也可以换作其他分割符"!"
而且目前只有"!"可以胜任,其他的(如例子#,@)虽然没有语法错误,但是不识别
sed使用地址:
sed中有两种行寻址:
1,行的数字范围
2,用文本模式来过滤出某行
都可以用相似方式实现:
[address] command
address {
command1
command2
command3
}
数字行寻址:
e9:
结果很明显,不做太多解释。$前面也介绍过
文本过滤模式过滤:
/pattern/command
e10:
当然组合命令也是可以的,比较繁
一个新的sed标识:d(elete)
看例子:
e11:
删除可以根据上面提到过的两种匹配模式
还有你甚至可以这样删除:
e12:
但是这么做有可能造成意外.第一次指定模式会"打开"行删除功能,第二个模式会"关闭"行删除功能.意思是会删除它们之间的元素
另外,只要匹配了打开功能,就开始删除.结果可能让你发疯:
e13:
sed的插入和追加:
插入命令i会在指定行之前增加一行
追加命令a会在指定行之后加入一个新行
令人纳闷的它们格式:
sed '[address]command\
new line'
例子:
e14:
$指最后一行:
e15:
同理可以在文本第一行插入.
sed 的修改:
同理修改要指定行地址
e16:
sed 转换命令
[address]y/inchars/outchars/ 等长转换
转换是一个全局命令,可以转化匹配的一切:
e17:
sed的打印
>p 打印文本行
>= 打印行号
>l 列出行
打印行:
e18:
打印行号:
e19:
列出行: 列出数据流中所有字符,包括可打印和不可打印的字符
e20:
sed的文本保存
[address]w filename
sed '1,2w test' file 把file文件的1,2行读到test中.
可以用-n选项禁止显示在屏幕上
sed的读文件
[address]r filename
sed '3r test' file 读出test内容插入到file文件的第3行后面
sed '/number/r test' file 读出test内容,插入到file中含number行后面
sed '$r test' file 把test内容插到file文件最后
正则表达式之旅_sed_awk的更多相关文章
- JAVA之旅(三十四)——自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫
JAVA之旅(三十四)--自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫 我们接着来说网络编程,TCP 一.自定义服务端 我们直接写一个服务端,让本机去连接 ...
- 我的Java开发学习之旅------>工具类:Java使用正则表达式分离出字符串中的中文和英文
今天看到一个工具类使用正则表达式将一大段字符串中的中文和英文都分离出来了,在此记录一下,读者可以收藏! import java.util.ArrayList; import java.util.Col ...
- F#之旅9 - 正则表达式
今天,cozy群有个群友发了条正则,问正则匹配相关的问题.虽然他的问题用html selector去处理可能更好,但是我也再一次发现:我忘了正则怎么写的了! 忘掉正则是有原因的,这篇文章会简单记录下F ...
- 我的Android进阶之旅------>Android使用正则表达式匹配扫描指定目录下的所有媒体文件(音乐、图像、视频文件)
今天使用正则表达式匹配指定目录下的所有媒体文件,下面将这份代码简化了,可以收藏下来,当作工具类. package match; import java.io.File; import java.uti ...
- webpack入坑之旅(二)loader入门
这是一系列文章,此系列所有的练习都存在了我的github仓库中vue-webpack 在本人有了新的理解与认识之后,会对文章有不定时的更正与更新.下面是目前完成的列表: webpack入坑之旅(一)不 ...
- JavaScript之旅(二)
JavaScript之旅(二) 二.进阶知识 js的正则表达式 异常处理 调试 变量提升 表单验证 JSON javascript:void(0) JavaScript 代码规范 二.进阶知识 1. ...
- 我的django之旅(一)
我的django之旅(一) 标签(空格分隔):django web 1.检验我们的python和django版本 liao@spring ~ $ python --version Python 2.7 ...
- 【C++探索之旅】第一部分第三课:第一个C++程序
内容简介 1.第一部分第三课:第一个C++程序 2.第一部分第四课预告:内存的使用 第一个C++程序 经过上两课之后,我们已经知道了什么是编程,编程的语言,编程的必要软件,C++是什么,我们也安装了适 ...
- java正则表达式去除html标签
当我们用ckeditor或其他一些在线文本编辑器的时候 内容里会有很多的标签 如下片段: <p><img alt="" src="/img/upload ...
随机推荐
- vue服务端渲染浏览器端缓存(keep-alive)
在使用服务器端渲染时,除了服务端的接口缓存.页面缓存.组建缓存等,浏览器端也避免不了要使用缓存,减少页面的重绘. 这时候我们就会想到vue的keep-alive,接下来我们说一下keep-alive的 ...
- 如何在hadoop中使用外部的python程序文件
业务场景大概是这样,我需要在公司hadoop集群上对博文进行结巴分词.我的数据是存储在hive表格中的,数据量涉及到五百万用户三个月内发的所有博文. 首先对于数据来说,很简单,在hive表格中就是两列 ...
- 二维数组快速排序(sort+qsort)
二维数组快速排序 qsort是c中快速排序,如果简单的一维数组排序,想必大家的懂.现在看一下二维数组的排序,虽然可以冒泡但是太费时间了,我们这里使用qsort来快速排序,看代码应该看得懂吧. 代码: ...
- 006---Python基本数据类型--集合
集合 .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px ...
- JAVA判断时间是否在时间区间内
package com.liying.tiger.test; import java.text.ParseException; import java.text.SimpleDateFormat; i ...
- AHOI2018 (暨HNOI2018)编外滚粗记
Day0: 向老师打了声报告就偷偷摸摸溜出了学校……感谢门卫师傅没把我当贼抓起来 车上背了一遍FFT,SAM的板子.嘴巴ac了两道CC水题.离线刷了一波知乎. 酒店好评. Day1: 不知不觉就开考了 ...
- WRITE
WRITE - int_format_options 基本形式 ... [LEFT-JUSTIFIED|CENTERED|RIGHT-JUSTIFIED] [NO-GAP] ...
- react ant-design自定义图标
ant-design给我们提供的图标不够怎么办呢?答案是我们可以自定义图标. 自定义图标也挺简单的,现在图标推荐用svg格式,那么我们就需要制作svg图片. 下面让我们看看如果制作svg图片吧. 1. ...
- MySQL 从入门到删库
基本操作 登陆指令 mysql -u用户名 -p密码(可以非明文输入) -h主机/IP -D端口 --prompt 提示符 修改提示符 \D 日期 \d 当前数据库 \h 服务器名 \u 用户名 // ...
- 15 GIL 全局解释器锁 C语言解决 top ps
1.GIL 全局解释器锁:保证同一时刻只有一个线程在运行. 什么是全局解释器锁GIL(Global Interpreter Lock) Python代码的执行由Python 虚拟机(也叫解释器主循环, ...