ILD

sed 3: Regular expressions: selecting text
作者:YUAN JIANPENG 邮箱:yuanjp@hust.edu.cn
发布时间:2018-8-17 站点:Inside Linux Development

5 Regular Expressions: selecting text


5.1 overview


5.2 Basic (BRE) and extended (ERE) regular expression

sed 默认是BRE,当使用-E, -r, --regexp-extended选项来开启ERE语法。


在GNU sed,BRE和ERE唯一的不同是几个特殊字符的含义:

? + parentheses braces {} |


在BRE语法中,这些字符没有特殊含义,除非前面使用了反斜杠。而ERE却恰好相反。


5.3 Overview of BRE syntax

char 单个普通字符匹配它自己

* 匹配前一个表达式0次或多次

. 匹配任何字符,包括新行

^ 匹配开头,其只在表达式和子表达式(\(和\|之后)的开头时才是特殊字符。

$ 匹配结尾,其只在表达式和子表达式结尾时,才是特殊字符。

[list]

[^list]

\+

\?

\{i\} 匹配i次

\{i,j\} 匹配i到j次都可以。

\{i,\} 至少匹配i次

\(regexp\) 将内部的regexpt组合成一个整体。

regexp1|regepx2 

\digit matches the digit-th \(...\)子表达式的内容,这叫做back reference

\n 匹配newline character

\char 匹配char,char是 $ * . [ \ ^


注意:

唯一像c的反斜杠序列是 \n 和 \\,

例如 \t 匹配字符 t,而不是一个tab character


注意:

匹配是贪婪的。


5.5 Character Classes and Bracket Expressions

bracket expression 是 [] 内部的字符列表,它匹配单个字符。如果第一个字符是^ ,则匹配不在列表中的字符。


连字符用来表示一个范围,

[a-d] 匹配 abcd中的一个。


支持预定的名字,它们本身就放在[]内。

$ seq 1 | sed "s/[[:digit:]]/x/"


和其它字符结合

1
2
3
4
5
6
7
sed "s/[a[:digit:]]/x/"
a
x
1
x
b
b


[:alnum:]

[;alpha:]

[:blank:]

[:cntrl:]

[:digit:]

[:graph:]

[:lower:]

[:print:]

[:punct:]

[:space:]

[:upper:]

[:xdigit:]


大多数元字符在bracket expressions中丢失了它们的特殊含义,如

[\*] 匹配反斜杠或者新号


] 结束bracket expression,如果想匹配这个字符,必须放在第一个。

- 不是第一个或最后一个,表示范围,否则表示字符本身

^ 第一个表示取反,否则表示字符本身


5.6 regular expression extensions


下面的序列有特殊的含义

\w 单词字符,数字,字母和下划线

\W 非单词字符

\b 匹配单词边界,本身不匹配任何字符,只是锚点。

1
2
3
sed "s/\b/X/g"
a,b
XaX,XbX

没有使用g flag,则只替换第一个。


\B

匹配不是单词边界的地方。

1
2
3
sed "s/\B/X/g"
ab
aXb

a b之间不是单词边界。


\s 空白字符,space和tabs,newlines也被匹配

\S 非空白字符

\< 单词的开头

\> 单词的结尾

\‘ 多行模式下,匹配pattern space的开头

\’ 多行模式下,匹配pattern space的结尾


5.7 back-references and subexpressions

可以用在search pattern和replacement part。

反斜杠加一个数字 \1,表示匹配的第一个子表达式。子表达式使用括号括起来


5.8 Escape Sequences 


\a

\f

\n

\r

\t

\v

\cx        control-x,x是一个字符,如c

\dxxx        xxx是10进制

\oxxx        xxx是8进制

\xxx        xx是16进制


escaping precedence

GNU sed 在传递text到正则表达式前处理escaping sequences。所以下述是等价的

$ echo 'a^c' | sed 's/^/b/'

$ echo 'a^c' | sed 's/\x5e/x/'


Copyright © linuxdev.cc 2017-2024. Some Rights Reserved.