【转】sed & awk经常使用正则表达式

正则表达式元字符

正则表达式中有两种基本元素:git

  1. 以字面值或变量表示的值(如.表明任意单个字符)。
  2. 操做符(如*表明将前面的字符重复任意次)。

元字符汇总正则表达式

特殊字符spa

用途ip

.字符串

匹配除换行符之外的任意单个字符。在awk中,句点也能匹配换行符。it

*table

匹配任意一个(包括零个)在它面前的字符(包括由正则表达式指定的字符)awk

[…]变量

匹配方括号中的字符类中的任意一个。若是方括号中第一个字符为脱字符号(^),则表示否认匹配,即匹配出了换行符和类中列出的哪些字符之外的全部字符。在awk中,也匹配换行符。连字符(-)用于表示字符的范围。若是类中的第一个字符为右方括号(])则表示它是类的成员。全部其余的元字符在被指定为类中成员时都会失去它们原来的含义。扩展

^

若是做为正则表达式的第一个字符,则表示匹配行的开始。在awk中匹配字符串的开始,即便字符串包含嵌入的换行符。

$

若是做为正则表达式的最后一个字符,则表示匹配行的结尾。在awk中匹配字符串的结尾,即便字符串包含嵌入的换行符。

\{n,m\}

匹配它前面某个范围内单个字符出现的次数(包括由正则表达式指定的字符)。\{n,m\}将匹配n次出现,\{n,\}至少匹配n次出现,并且\{n,m\}匹配n和m之间的任意次出现。

\

转意随后的特殊字符。

+

匹配前面的正则表达式的一次或屡次出现。

?

匹配前面的正则表达式的零次或一次出现。

|

指定能够匹配其前面的或后面的正则表达式。

()

对正则表达式分组

{n,m}

匹配它前面某个范围内单个字符出现的次数(包括由正则表达式指定的字符)。{n}表示匹配n次出现,{n,}表示至少匹配n次出现,{n,m}匹配n和m之间的任意次出现。

广泛存在的反斜杠

元字符反斜杠(/)将元字符转换成普通字符(或将普通字符转换成元字符)。它强制将任意元字符解释为普通字符,一边匹配该字符自己。

在sed中,使用反斜杠将一组普通字符转意为元字符。

如 \(\) \{\} \n

字符类

字符类是对通配符概念的改进。咱们能够列出要匹配的字符,而不是匹配特殊位置的任意字符。使用方括号元字符([])将字符列表括起来,其中每一个字符占据一个位置。

注意:在方括号中元字符会失去它们的含义。

如[Ww]hat能够匹配what或者What

字符类中的的特殊字符:

字符

功能

\

转义任意特殊字符(只用于awk中)

-

当它再也不第一个或最后一个位置时,表示一个范围。

^

仅当在第一个位置时表示反转匹配。

反斜杠只在awk中是特殊的,所以可使用字符类"[a\]1]"以匹配一个a、一个]或一个1。

 

若是闭括号(])是做为类中的第一个字符出现(或者是脱字符后的第一个字符),那么它就被解释为类的一个成员。若是连字符在一个类中是第一个或最后一个字符,则失去其特殊含义。所以,为了匹配算术操做符,咱们在下面的实例中将连字符(-)放在第一位:

        [-+*/]

使用正则表达式匹配下面的日期,该日期可能有下面两种格式:

MM-DD-YY

MM/DD/YY

下面的正则表达式指示每一个字符位置可能的树枝范围:

        [0-9][0-9][-/][0-3][0-9][-/][0-9][0-9]

"-"或"/"均可能是定界符。在第一个位置防止连字符确保它在字符类中解释为字面意义,即做为一个连字符,而不是指示一个范围。

排除字符类

一般,字符类包括在哪一个位置想要匹配的全部字符。在类中做为第一个字符的脱字符(^)将类中全部字符都排除在被匹配以外。相反,除换行符之外没有在列的方括号中的任意字符都将被匹配。

下面的模式将匹配任意非数字字符:

    [^0-9]

它匹配字面表中全部的大写和小写字面以及全部特殊字符,例如标点符号。

POSIX字符类补充

POSIX标准对正则表达式字符和操做符的含义进行了形式化。这种标准定义了两类正则表达式:基本的正则表达式(BRE),grep和sed使用这种正则表达式;扩展的正则表达式,egrep和awk使用这种正则表达式。

POSIX还改变了经常使用的属于,咱们一直成为"字符类"的东西在POSIX标准中成为"括号表达式"。在括号表达式中,出了字面字符(例如a, !等)之外,还能够由其余标记。如:

  • 字符类。由[::]包围的关键字组成的POSIX字符类。关键字描述了不一样的字符类,如文字字符类,控制字符等等。
  • 整理复合。整理复合是多字符的序列。表示这些字符应该被看做是一个单元,它由[,.]包围的字符组成。
  • 等价类。等价类列出了应该看做是等价的字符集,它由地区化的字符元素(有[==]包围)组成。

全部这3种结果都必须出如今括号表达式的方括号中。例如[[:alpha:]!]匹配任意单个字幕字符或感叹号,[[.ch.]]匹配整理元素ch,但不止匹配字幕c或字幕h。

POSIX字符类:

[:alnum:]

可打印的字符(包括空白字符)

[:alpha:]

字母字符

[:blank:]

空格和制表符

[:cntrl:]

控制字符

[:digit:]

数字字符

[:graph:]

可打印和可见的(非空格)字符

[:lower:]

小写字符

[:print:]

可打印的字符(包括空包字符)

[:punct:]

标点符号字符

[:space:]

空白字符

[:upper:]

大写字符

[:xdigit:]

十六进制数字

定位元字符

有两个元字符用于指定字符串出如今行首或行末的上下文。脱字符^表示行开始,$表示行结束。

可使用两个联系的定位元字符来匹配空行,即:

    ^$

可使用这种模式计算文件中的空行数,在grep中使用计数选项-c:

    # grep –c '^$' ch04

    5

若是想使用sed来删除空行,那么这个正则表达式颇有用。下面的正则表达式能够用于匹配空行,即便其中包含空格:

    ^*$

一样,可使用如下表达式匹配整个行:

    ^.*$

在sed(和grep)中,只有当"^"和"$"分别出如今正则表达式的开始或结尾才是特殊的。所以"^abc" 意味着 "匹配只处于行开始处的字母a、b和c",而"ab^c"觉得着"匹配处于行的任意位置的a、b、字面意义的^,而后是c"。这对于"$"一样适用。

 

在awk中则不一样,"^"和"$"老是特殊的,即便它们可能使编写的正则表达式不匹配任何东西。能够说,在awk中,当想要匹配字面"^"或"$"时,无论它处于正则表达式的什么位置都应该使用反斜杠对其进行转义。

字符的跨度

在grep和sed中使用\{和\}。POSIX egrep 和 POSIX awk使用{和}。在任何状况下,大括号包围一个或两个参数。

    \{n,m\}

n和m是0到255之间的整数。若是只指定\{n\}自己,那么将精确匹配前面的字符或正则表达式的n次出现。若是指定\{n,m\},那么就匹配出现的次数为n和m之间的任意次数。

选择性操做

竖线(|)元字符是元字符扩展集的一部分,用于指定正则表达式的联合。若是某行匹配其中的一个正则表达式,那么它就匹配该模式。

分组操做

圆括号()用于对正则表达式进行分组并设置优先级。它们是元字符扩展集的一部分。假设在文本文件中将公司的名称为"BigOne"或"BigOneComputer",使用正则表达式:

    BigOne(Computer)?

将匹配字符串"BigOne"自己或者后面跟有一个字符串"Computer"的形式。一样,有些属于有时会用全拼,有时会用缩写、则可使用:

    # egrep "Lab(oratorie)?s" mail.list

    Bell Laboratories, Lucent Technologies

    Bell Labs

能够用竖线和圆括号来对选择性操做进行分组。在下面的示例中,使用它来指定单词"company"的单数或复数匹配。

    compan(y|ies)

注意:大多数sed和grep 的版本中不能对加圆括号的一组字符应用数量词,可是在egrep和awk的全部版本都是能够的。

限制范围

一个正则表达式为:

    A.*Z

匹配的结果为

All of us, including Zippy, our dog

All of us, including Zippy and Ziggy

All of us, including Zippy and Ziggy and Zelda

下划线的字符串表示匹配的字符串,即.*在每种状况下都会匹配可能的最长的范围。

 

正则表达式尝试匹配最长的字符串,这可能会引发意想不到的问题。例如,下面的正则表达式与引号中的任意个字符匹配:

    ".*"

输入字符串为:

    .Se "Appendix" "Full Progarm Listings."

要匹配第一个参数,能够用下面的正则表达式来描述:

    \.Se ".*"

然而,由于模式中的第二个引号与该行上的最后一个引号匹配,因此它结束匹配整个行。若是知道参数的个数,那么能够对每一个进行说明:

    \.Se ".*" ".*"

虽然这种方法能够像指望的那样工做,可是每行也许不会有相同书目的参数,省略你只想要第一个参数。这里有一个匹配两个引号之间最短范围的正则表达式:

    "[^ "]*"

它匹配引号而且后面跟有任意个字符的状况,但它不匹配引号后面跟有引号的状况。

其余一些正则

国家的缩写

□[A-Z][A-Z]□

HTML代码

<[^ >]*>

匹配空行

^$

匹配整行

^.*$

匹配一个或多个空格(空内容的行)

□□*

相关文章
相关标签/搜索