【那年那人那linux】“正则表达式”初窥之二则问题

始于linux学习过程中欲检测学习效果,同学推荐了两道正则表达式的题目。这两道题目字数不多,但却引发了我的一段思考。操作环境CentOS6.7 2.6.32-573.22.1.el6.x86_64

现题目整理如下:

第一则

请使用正则表达式与sed命令将/etc/passwd内的第一个单词与最后一个单词置换。例如:

sc:x:891:809::/home/sc:/bin/bash #操作之前
bash:x:891:809::/home/sc:/bin/sc #操作之后

第二则

请使用正则表达式与sed命令将/etc/passwd内的第一组数字与最后一个单词置换。

sc:x:891:809::/home/sc:/bin/bash #操作之前
sc:x:bash:808::/home/sc:/bin/890 #操作之后

解答

首先来看第一则.

首先,我们的主要目标提取第一个单词和最后一个单词,观察单词的特点,纯字母形式,故可以表示为(^[a-zA-Z]*)和([a-zA-Z]*$);

第二步,把剩余的部分看作一个整体,观察特点,我们会发现剩余部分是两个“:”之间的部分,于是可以想到冒号开头、冒号结尾,紧接着,为了完整的表示出这个部分,我们可以使用([^a-zA-Z].*[^a-zA-Z])(如此,三个部分表示完毕);

最后根据sed命令替换的规则,辅以后向引用“\3\2\1”,完成操作!下面贴上命令行:

[[email protected] ~]# sed -r ‘s#(^[a-zA-Z]*)([^a-zA-Z].*[^a-zA-Z])([a-zA-Z]*$)#\3\2\1#g‘ /etc/passwd
bash:x:0:0:root:/root:/bin/root
nologin:x:1:1:bin:/bin:/sbin/bin
......
bash:x:889:807::/home/sa:/bin/sa
bash:x:890:808::/home/sb:/bin/sb
bash:x:891:809::/home/sc:/bin/sc
[[email protected] ~]#

小结:我们对文件内容的每一行进行分析,结果发现,按照题目要求可以将一行文字分为,“单词--两个非字母之间的部分--单词”。按照这个模式,我们以单词为用力点,将语句完美分隔开了,shell也没有识别错误。

再来看第二则,这道题目是上一题的升级版本,乍一看可以用是第一题的模式来解题。我们先来整体分析,寻找一下思路。

整体分析:按照题目要求需要调换第一组数字和最后一个单词,由上一题的分析得出,我们可以选择从数字和单词这两点着手实验。我们可以观察出下面这个模式“非数字部分--第一组数字--非字母之间的部分--最后一个单词”。从shell执行解析正则表达式的顺序, 上面这一模式是正确的,能够完整表示出一行的内容。下面贴上命令行:

[[email protected] ~]# sed -r ‘s#(^[^0-9]*)([0-9]*)([^a-zA-Z].*[^a-zA-Z])([a-zA-Z]*$)#\1\4\3\2#g‘ /etc/passwd
root:x:bash:0:root:/root:/bin/0
bin:x:nologin:1:bin:/bin:/sbin/1
......
sa:x:bash:807::/home/sa:/bin/889
sb:x:bash:808::/home/sb:/bin/890
sc:x:bash:809::/home/sc:/bin/891
[[email protected] ~]#

启发

在学习使用正则表达式的时候,分析要求,选好分隔行信息的关键点,以此完成匹配。

时间: 2024-07-29 19:51:46

【那年那人那linux】“正则表达式”初窥之二则问题的相关文章

【那年那人那linux】机会,抓到才是你的!

老师给机会可以让同学上台分享"忘记root密码,如何找回密码"的解决办法.认真准备了一个小假期,虽说不是精通linux原理,但也是有自己的解决思路. 今天上课,本做好准备上台演示,说实话当时真有点怯场,没有第一个冲上去!后来大教室的赵同学首先上去演示,年纪比我小,讲的也不错,值得夸赞!本以为下一个是我上台,老师直接叫的准备"批量创建用户并设置8位随机密码"的同学上台. 听到这个,当时站在后面的我确实有一些尴尬... 回到座位,转念一想.自己还是怕了,没有冲上去抓住机

Scrapy 1.4 文档 01 初窥 Scrapy

初窥 Scrapy Scrapy 是用于抓取网站并提取结构化数据的应用程序框架,其应用非常广泛,如数据挖掘,信息处理或历史存档. 尽管 Scrapy 最初设计用于网络数据采集(web scraping),但它也可用于使用 API(如 Amazon Associates Web Services)提取数据或用作通用的网络爬虫. 爬虫(spider)示例 为了向您展示 Scrapy 带给您的是什么,我们将使用最简单的方式运行一个爬虫,向您展示一个 Scrape Spider 的例子. 这是一个爬虫的

玩转oo对象模型(1) 之 初窥c++对象模型

============================================== copyright: KIRA-lzn ============================================== 转载请注明出处,这篇是我原创,翻版必究! ============================================== 第二篇,如果写的好,请点个赞呦.当然有不对之处,非常欢迎拍砖!!!! 自我介绍: USTC研一学生,目前在intel实习,研发岗 第二篇

jQuery源码学习(2):选择器初窥

选择器初窥 代码架构: jQuery选择器可以依照传入数据的类型分为五大类: 传入字符串:$("div"), $("#id"), $(".div1"),$(".div p.title") 传入html代码:$("<div></div>"), $("<div>1</div><div>2</div>") 传入对象:$(d

Boost.ASIO简要分析-1 初窥

Boost.Asio是一个主要用于网络及底层I/O编程的跨平台C++库. 1. 初窥 Boost.Asio支持对I/O对象进行同步及异步操作. 1.1 同步操作 同步操作的事件顺序如下图所示: 1) 调用者调用I/O对象的connect函数开始连接操作,socket.connect(server_endpoint): 2) I/O对象将连接请求传递给io_service: 3) io_service调用操作系统函数: 4) 操作系统返回结果给io_service: 5) io_service将结

初窥netfilter/iptables

做这个东西太麻烦了,一不小心,就被自己关门外了. ---------------------------------------------- 一.前言 二.环境 三.语法解析 四.配置及测试 1.SNAT案例 2.DNAT案例 3.SSH案例 4.SSH深入案例(自定义规则) 5.web和ftp(自定义规则) 6.web和ftp(系统默认规则) 五.保存 ---------------------------------------------- 一.前言 iptables即Linux 内核集

Linux正则表达式grep与egrep

Linux正则表达式grep与egrep 正则表达式:它是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串.在很多文本编辑器或其他工具里,正则表达式通常被用来检索或替换那些符合某个模式的文本内容.其实正则表达式,只是一种思想,一种表示方法.只要我们使用的工具支持表示这种思想那么这个工具就可以处理正则表达式的字符串.常用的工具有grep, sed, awk,这三个都是针对文本的行才操作的. grep  过滤器语法: grep  [-cinvABC]  'word'  filenam

初窥C++11:自动类型推导与类型获取

auto 话说C语言还处于K&R时代,也有auto a = 1;的写法.中文译过来叫自动变量,跟c++11的不同,C语言的auto a = 1;相当与 auto int a = 1;语句. 而C++11的auto是有着严格的类型推导出来的.以前是这么写 int a = 1; 现在,编译器知道a是int型了.所以可以这么写 auto a = 1; 对于类型比较长的,如vector<string>::iterator这类的,能少敲些字符了. 如果仅仅就这点作用,那么对编程实在没什么太大的益

Hadoop学习笔记(9) ——源码初窥

Hadoop学习笔记(9) ——源码初窥 之前我们把Hadoop算是入了门,下载的源码,写了HelloWorld,简要分析了其编程要点,然后也编了个较复杂的示例.接下来其实就有两条路可走了,一条是继续深入研究其编程及部署等,让其功能使用的淋漓尽致.二是停下来,先看看其源码,研究下如何实现的.在这里我就选择第二条路. 研究源码,那我们就来先看一下整个目录里有点啥: 这个是刚下完代码后,目录列表中的内容. 目录/文件 说明 bin 下面存放着可执行的sh命名,所有操作都在这里 conf 配置文件所在