仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1850|回复: 18
打印 上一主题 下一主题

[其他Linux] Linux制作之Linux/Unix工具与正则表达式的POSIX标准仓酷云

[复制链接]
不帅 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:30:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
学习python,无论你是打算拿他当主要开发语言,还是当辅助开发语言,你都应该学习他,因为有些时间我们耗不起。
对正则表达式有基础懂得的读者,必定不会生疏『d』、『[a-z]+』之类的表达式,前者婚配一个数字字符,后者婚配一个以上的小写英笔墨母。可是假如你用过vi、grep、awk、sed之类Linux/Unix下的工具也许会发明,这些工具固然撑持正则表达式,语法却很纷歧样,照一般习气的举措写的『d』、『[a-z]+』之类的正则表达式,常常不是没法辨认就是婚配毛病。并且,这些工具本身之间也存在差别,一样的布局,偶然必要本义偶然不必要本义。这,事实是为何呢?
缘故原由在于,Unix/Linux下的工具年夜多接纳POSIX标准,同时,POSIX标准又可分为两种派别(flavor)。以是,起首有需要懂得一下POSIX标准。
POSIX标准

罕见的正则表达式记法,实在都源于Perl,实践上,正则表达式从Perl衍生出一个显赫的派别,叫做PCRE(PerlCompatibleRegularExpression),『d』、『w』、『s』之类的记法,就是这个派别的特性。可是在PCRE以外,正则表达式另有别的派别,好比上面要先容的POSIX标准的正则表达式。
POSIX的全称是PortableOperatingSystemInterfaceforuniX,它由一系列标准组成,界说了UNIX操纵体系应该撑持的功效,以是“POSIX标准的正则表达式”实在只是“关于正则表达式的POSIX标准”,它界说了BRE(BasicRegularExpression,基础型正则表达式)和ERE(ExtendedRegularExpress,扩大型正则表达式)两年夜派别。在兼容POSIX的UNIX体系上,grep和egrep之类的工具都遵守POSIX标准,一些数据库体系中的正则表达式也切合POSIX标准。
BRE

在Linux/Unix经常使用工具中,grep、vi、sed都属于BRE这一派,它的语法看起来对照奇异,元字符『(』、『)』、『{』、『}』必需本义以后才具有特别寄义,以是正则表达式『(a)b』只能婚配字符串(a)b而不是字符串ab;正则表达式『a{1,2}』只能婚配字符串a{1,2},正则表达式『a{1,2}』才干婚配字符串a大概aa。
之以是这么贫苦,是由于这些工具的出生工夫很早,正则表达式的很多功效倒是慢慢开展演变出来的,之前这些元字符大概并没有特别的寄义;为包管向后兼容,就只能利用本义。并且有些功效乃至基本就不撑持,好比BRE就不撑持『+』和『?』量词,也不撑持多选布局『(…|…)』和反向援用『1』、『2』…。
不外明天,地道的BRE已很少见了,究竟人人已以为正则表达式“理所应该”撑持多选布局和反向援用等功效,没有的确太不便利。以是固然vi属于BRE派别,但供应了这些功效。GNU也对BRE做了扩大,撑持『+』、『?』、『|』,只是利用时必需写成『+』、『?』、『|』,并且也撑持『1』、『2』之类反向援用。如许,GNU的grep等工具固然名义上属于BRE流,但更切实的称号是GNUBRE。
ERE

在Linux/Unix经常使用工具中,egrep、awk则属于ERE这一派,。固然BRE名为“基础”而ERE名为“扩大”,但ERE其实不请求兼容BRE的语法,而是自成一体。因而个中的元字符不必本义(在元字符之前增加反斜线会作废其特别寄义),以是『(ab|cd)』就能够婚配字符串ab大概cd,量词『+』、『?』、『{n,m}』能够间接利用。ERE并没有明白划定撑持反向援用,可是很多工具都撑持『1』、『2』之类的反向援用。
GNU出品的egrep等工具就属于ERE流(更正确的名字是GNUERE),但由于GNU已对BRE做了很多扩大,所谓的GNUERE实在只是个说法罢了,它有的功效GNUBRE都有了,只是元字符不必要本义罢了。
上面的表格扼要申明了几种POSIX派别的区分[1](实在,如今的BRE和ERE在功效上并没有甚么区分,次要的差别是在元字符的本义上)。
几种POSIX派别的申明
派别

申明

工具

BRE

(、)、{、}都必需本义利用,不撑持+、?、|

grep、sed、vi(但vi撑持这些多选布局和反向援用)

GNUBRE

(、)、{、}、+、?、|都必需本义利用

GNUgrep、GNUsed

ERE

元字符不用本义,+、?、(、)、{、}、|能够间接利用,1、2的撑持不断定

egrep、awk

GNUERE

元字符不用本义,+、?、(、)、{、}、|能够间接利用,撑持1、2
grep–E、GNUawk


为了便利查阅,上面再用一张表格列出基础的正则功效在经常使用工具中的暗示法,个中的工具GNU的版本为准。
经常使用Linux/Unix工具中的暗示法
PCRE记法

vi/vim

grep

awk

sed

*

*

*

*

*

+

+

+

+

+

?

=

?

?

?

{m,n}

{m,n}

{m,n}

{m,n}

{m,n}

*

<>

<>

<>

y<>

(…|…)

(…|…)

(…|…)

(…|…)

(…|…)

(…)

(…)

(…)

(…)

(…)

12

12

12

不撑持

12


注:PCRE中经常使用来暗示“单词的肇端或停止地位”,但Linux/Unix的工具中,一般用<来婚配“单词的肇端地位”,用>来婚配“单词的停止地位”,sed中的y能够同时婚配这两个地位。
POSIX字符组

在某些文档中,你还会发明相似『[:digit:]』、『[:lower:]』之类的暗示法,它们看起来不难了解(digit就是“数字”,lower就是“小写”),但又很奇异,这就是POSIX字符组。不但在Linux/Unix的罕见工具中,乃至一些酿成言语中都呈现了这些字符组,为制止狐疑,这里有需要扼要先容它们。
在POSIX标准中,『[a-z]』、『[aeiou]』之类的记法仍旧是正当的,其意义与PCRE中的字符组也没有区分,只是这类记法的正确称号是POSIX方括号表达式(bracketexpression),它次要用在Unix/Linux体系中。POSIX方括号暗示法与PCRE字符组的最次要不同在于:POSIX字符组中,反斜线不是用来本义的。以是POSIX方括号暗示法『[d]』只能婚配和d两个字符,而不是『[0-9]』对应的数字字符。
为懂得决字符组中特别意义字符的本义成绩,POSIX方括号暗示律例定,假如要在字符组中表达字符](而不是作为字符组的停止标志),应该让它紧跟在字符组的开方括号以后,以是POSIX中,正则表达式『[]a]』能婚配的字符就是]和a;假如要在POSIX方括号暗示法中表达字符-(而不是局限暗示法),必需将它紧挨在闭方括号]之前,以是『[a-]』能婚配的字符就是a和-。
POSIX标准也界说了POSIX字符组,它近似等价于于PCRE的字符组简记法,用一个有直不雅意义的名字来暗示某一组字符,好比digit暗示“数字字符”,alpha暗示“字母字符”。
不外,POSIX中另有一个值得注重的观点:locale(一般翻译为“言语情况”)。它是一组与言语和文明相干的设定,包含日期格局、泉币币值、字符编码等等。POSIX字符组的意义会依据locale的变更而变更,上面的表格先容了罕见的POSIX字符组在ASCII言语情况与Unicode言语情况下的意义,供人人参考。
POSIX字符组
POSIX字符组

申明

ASCII言语情况

Unicode言语情况

[:alnum:]*

字母字符和数字字符

[a-zA-Z0-9]

[p{L&}p{Nd}]

[:alpha:]

字母

[a-zA-Z]

p{L&}

[:ascii:]

ASCII字符

[x00-x7F]

p{InBasicLatin}

[:blank:]

空格字符和制表符

[        ]

[p{Zs}        ]

[:cntrl:]

把持字符

[x00-x1Fx7F]

p{Cc}

[:digit:]

数字字符

[0-9]

p{Nd}

[:graph:]

空缺字符以外的字符

[x21-x7E]

[^p{Z}p{C}]

[:lower:]

小写字母字符

[a-z]

p{Ll}

[:print:]

相似[:graph:],但包含空缺字符

[x20-x7E]

P{C}

[:punct:]

标点标记

[][!"#$%&()*+,./:;<=>?@^_`{|}~-]

[p{P}p{S}]

[:space:]

空缺字符

[       
vf]

[p{Z}       
vf]

[:upper:]

年夜写字母字符

[A-Z]

p{Lu}

[:word:]*

字母字符

[A-Za-z0-9_]

[p{L}p{N}p{Pc}]

[:xdigit:]

十六进制字符

[A-Fa-f0-9]

[A-Fa-f0-9]


注1:标志*的字符组简记法并非POSIX标准中的,但利用良多,一样平常言语中都供应,文档中也会呈现。
注2:对应的Unicode属性请参考本系列文章已刊发过的关于Unicode的部分。
POSIX字符组的利用有所分歧。次要区分在于,PCRE字符组简记法能够离开方括号间接呈现,而POSIX字符组必需呈现在方括号内,以是一样是婚配数字字符,独自呈现时,PCRE中能够间接写『d』,而POSIX字符组就必需写成『[[:digit:]]』。
Linux/Unix下的工具中,一样平常都能够间接利用POSIX字符组,而PCRE的字符组简记法『w』、『d』等则年夜多不撑持,以是假如你看到『[[:space:]]』而不是『s』,必定不要感应奇异。
不外,在经常使用的编程言语中,Java、PHP、Ruby也撑持利用POSIX字符组。个中Java和PHP中的POSIX字符组都是依照ASCII言语情况举行婚配;Ruby的情形则要庞大一点,Ruby1.8依照ASCII言语情况举行婚配,并且不撑持『[:word:]』和『[:alnum:]』,Ruby1.9依照Unicode言语情况举行婚配,同时撑持『[:word:]』和『[:alnum:]』。
申明:关于正则表达式的系列文章到此即告一段落,作者比来已完成了一本关于正则表达式的书本,个中更具体也更周全地解说了正则表达式利用中的各类成绩。该书暂命名《正则扶引》,估计近期上市,有乐趣的读者敬请存眷。
[1]关于ERE和BRE的具体标准,能够参考http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap09.html。
关于作者
余晟,程序员,曾任抓虾网初级参谋,现就任于昌大立异院,感乐趣的偏向包含搜刮和散布式算法等。翻译喜好者,译有《精晓正则表达式》(第三版)和《手艺向导之路》,今朝正在写作《正则表达式傻瓜书》(暂命名),但愿为国际开辟偕行奉献一本有用的正则表达式教程。

要明白学好linux不是一件一蹴而就的事,一定要能坚持使用它,特别是在使用初期。
莫相离 该用户已被删除
沙发
发表于 2015-1-21 08:49:41 | 只看该作者
众所周知,目前windows操作系统是主流,在以后相当长的时间内不会有太大的改变,其方便友好的图形界面吸引了众多的用户。
admin 该用户已被删除
板凳
发表于 2015-1-27 13:23:17 | 只看该作者
应对Linux的发展历史和特点有所了解,Linux是抢占式多任务多用户操作系统,Linux最大的优点在于其作为服务器的强大功能,同时支持多种应用程序及开发工具。
精灵巫婆 该用户已被删除
地板
发表于 2015-2-3 05:09:05 来自手机 | 只看该作者
对Linux命令熟悉后,你可以开始搭建一个小的Linux网络,这是最好的实践方法。Linux是网络的代名词,Linux网络服务功能非常强大,不论是邮件服务器、Web服务器、DNS服务器等都非常完善。
山那边是海 该用户已被删除
5#
发表于 2015-2-8 19:54:43 | 只看该作者
为了更好的学习这门课程,我不仅课上认真听讲,课下也努力学习,为此还在自己的电脑上安装了Ubuntu系统。
不帅 该用户已被删除
6#
 楼主| 发表于 2015-2-26 00:30:25 | 只看该作者
主流Linux发行版都自带非常详细的文档(包括手册页和FAQ),从系统安装到系统安全,针对不同层次的人的详尽文档,仔细阅读文档后40%问题都可在此解决。
小妖女 该用户已被删除
7#
发表于 2015-3-8 10:44:24 | 只看该作者
熟悉系统的基本操作,Linux的图形界面直观,操作简便,多加上机练习就可熟悉操作,在Linux下学习办公软件等常用软件。
第二个灵魂 该用户已被删除
8#
发表于 2015-3-11 22:16:29 | 只看该作者
通过自学老师给的资料和向同学请教,掌握了一些基本的操作,比如挂载优盘,编译程序,在Linux环境下运行,转换目录等等。学了这些基础才能进行下面的模拟OS程序。?
因胸联盟 该用户已被删除
9#
发表于 2015-3-14 19:37:19 | 只看该作者
首先Linux是开源的,这也是最主要的原因,想学windows,Unix,对不起我们没源代码。也正是因为这样,Linux才能够像滚雪球一样越滚越大,发展到现在这种规模。
谁可相欹 该用户已被删除
10#
发表于 2015-3-17 00:14:27 | 只看该作者
Linux最大的特点就是其开源性,这一点是十分难得的,这也是它能够存在到现在的原因之一。
11#
发表于 2015-3-21 09:37:36 | 只看该作者
得到到草率的回答或者根本得不到任何Linux答案。越表现出在寻求帮助前为解决问题付出的努力,你越能得到实质性的帮助。
冷月葬花魂 该用户已被删除
12#
发表于 2015-3-23 05:18:06 | 只看该作者
眼看这个学期的Linux课程已经告一段落了,我觉得有必要写一遍心得体会来总结一下这学期对着门课程的学习。
活着的死人 该用户已被删除
13#
发表于 2015-3-29 16:34:35 | 只看该作者
请问谁有Linux的学习心得的吗?简单的说说?
再见西城 该用户已被删除
14#
发表于 2015-4-2 23:27:38 | 只看该作者
如果上面的措施没有解决问题,此时你就需要Linux社区的帮助了。 Linux的使用者一般都是专业人士,他们有着很好的电脑背景且愿意协助他人。
愤怒的大鸟 该用户已被删除
15#
发表于 2015-4-3 22:01:56 | 只看该作者
Linux最大的特点就是其开源性,这一点是十分难得的,这也是它能够存在到现在的原因之一。
老尸 该用户已被删除
16#
发表于 2015-4-8 04:17:00 | 只看该作者
以前觉得Linux就跟dos一样,全是用命令窗口,相对于窗口界面来说多麻烦呀。
蒙在股里 该用户已被删除
17#
发表于 2015-4-12 02:57:35 | 只看该作者
硬盘安装及光盘安装,清楚了解安装Linux应注意的有关问题,如安装Linux应在最后一个分区内,至少分二个分区。
透明 该用户已被删除
18#
发表于 2015-4-18 02:28:49 | 只看该作者
如果上面的措施没有解决问题,此时你就需要Linux社区的帮助了。 Linux的使用者一般都是专业人士,他们有着很好的电脑背景且愿意协助他人。
柔情似水 该用户已被删除
19#
发表于 2015-4-22 00:37:24 | 只看该作者
我们自学,就这个循环的过程中,我们学习了基本操作,用vi,shell,模拟内存的分配过程等一些OS管理。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-4-19 18:50

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表