5.1 overview
sed 默认是BRE,当使用-E, -r, --regexp-extended选项来开启ERE语法。
在GNU sed,BRE和ERE唯一的不同是几个特殊字符的含义:
? + parentheses braces {} |
在BRE语法中,这些字符没有特殊含义,除非前面使用了反斜杠。而ERE却恰好相反。
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
注意:
匹配是贪婪的。
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,如果想匹配这个字符,必须放在第一个。
- 不是第一个或最后一个,表示范围,否则表示字符本身
^ 第一个表示取反,否则表示字符本身
下面的序列有特殊的含义
\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的结尾
可以用在search pattern和replacement part。
反斜杠加一个数字 \1,表示匹配的第一个子表达式。子表达式使用括号括起来
\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/'