对一个字符串按每x位进行分割
1 | # 每8位进行分割,表达式所匹配的含义是:匹配一个位置,左边有字符,右边包含的字符总数是8的倍数 |
使用 perl 来进行替换
1 | # 配置位置,并不匹配一个具体的字符,锚点 |
使用 sed 进行替换
1 | # 使用捕获型括号 |
对一个字符串按每x位进行分割
1 | # 每8位进行分割,表达式所匹配的含义是:匹配一个位置,左边有字符,右边包含的字符总数是8的倍数 |
使用 perl 来进行替换
1 | # 配置位置,并不匹配一个具体的字符,锚点 |
使用 sed 进行替换
1 | # 使用捕获型括号 |
不同的正则表达式工具,背后的引擎可能是不同的,相同的正则表达式可能在不同的工具中会获得不同的结果(不同的正则表达式也可能获得相同的结果),所以要注意这种语义的差异,如:
1 | # perl regex pattern result |
正则表达式的更有意义的操作:检查某个正表达式是否能够匹配某个字符串;查找和替换,字符串的更新
集成式 (integrated)
正则表达式是内嵌在语言中的,属于语言的低级语法,如 Perl, 其他两种,不是内建的操作符来处理,由普通的函数接受普通的字符串,将他们作为正则表达式进行处理
程序式 (procedural)
函数式
面向对象式 (object-oriented)
通过构造函数及方法,如 Java 通过构造 Pattern、Matcher 对象来实现,当然也提供了函数式的静态方法来使用正则表达式
表示 | Unicode code point | 描述 |
---|---|---|
LF | U+000A | ASCII 换行符 |
VT | U+000B | ASCII 垂直制表符 |
FF | U+000C | ASCII 进纸符 |
CR | U+000D | ASCII 回车 |
CR/LF | U+000D U+000A | ASCII 回车/换行 |
NEL | U+0085 | Unicode 换行 |
LS | U+2028 | Unicode 行分隔符 |
PS | U+2029 | Unicode 段分隔符 |
字母 | 模式 |
---|---|
i | 不区分大小写的匹配模式 |
x | 宽松排列和注释模式 |
s | 点号通配模式(单行模式) |
m | 增强的行锚点模式(多行模式) |
command | description |
---|---|
P | 打印 pattern space 中的一行 |
D | 删除当前 pattern space 的一行,并重新开始新的循环 |
N | 读取输入源的下一行,并追加到 pattern space,使用 newline 分隔,并继续当前循环的执行(execution of cycle) |
一行指的是,使用行分隔符分隔
sed 命令中,似乎有这样的规约:大写字母的命令总是与多行数据相关的;通常利用这些命令实现一个队列 FIFO
.
例子:移除文件中最后5行:
1 | cat -n inputfile | sed -En -e ' |
利用可以追加(N - read and append)到 pattern space 的命令,以及删除(D) pattern space 中首行的命令,可以在 pattern space 中保持一个大小为 5 的队列,当第 6 行的数据追加到 pattern space 时,出队,即打印(P)队首的元素, 并删除(D)队首的行, 最终 pattern space 中保留了最后 5 行的数据,其余行已经打印,到达文件末尾,执行结束。
1 | $ cat .bashrc |
1 | $ cat .none_interactive_bashrc |
via: Alex Xu