正则表达式
正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular Expression,在代码中常简写为 regex、regexp 或 RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。
基本语法
一个正则表达式通常被称为一个模式(pattern),为用来描述或者匹配一系列符合某个句法规则的字符串。
-
选择
|竖直分隔符表示选择,例如"boy|girl"可以匹配"boy"或者"girl"
-
数量限定
数量限定除了常用的*,还有+加号,?问号, 如果在一个模式中不加数量限定符则表示出现一次且仅出现一次: +表示前面的字符必须出现至少一次(1 次或多次), 例如,"goo+gle",可以匹配"gooogle","goooogle"等; ?表示前面的字符最多出现一次(0 次或 1 次), 例如,"colou?r",可以匹配"color"或者"colour"; *星号代表前面的字符可以不出现,也可以出现一次或者多次、 (0 次、或 1 次、或多次), 例如,“0*42”可以匹配 42、042、0042、00042 等。
-
范围和优先级
()圆括号可以用来定义模式字符串的范围和优先级, 这可以简单的理解为是否将括号内的模式串作为一个整体。 例如,"gr(a|e)y"等价于"gray|grey", (这里体现了优先级,竖直分隔符用于选择 a 或者 e ), "(grand)?father"匹配 father 和 grandfather (这里体现了范围,?将圆括号内容作为一个整体匹配)。
-
语法(部分)
正则表达式有多种不同的风格,下面列举一些常用的适用于 perl和python编程语言及grep或egrep的正则表达式匹配规则:
字符 | 描述 |
---|---|
\ | 将下一个字符标记为一个特殊字符、或一个原义字符。例如,“n”匹配字符“n”。“\n”匹配一个换行符。序列“\”匹配“\”而“(”则匹配“(” |
^ | 匹配输入字符串的开始位置 |
$ | 匹配输入字符串的结束位置 |
{n} | n 是一个非负整数。匹配确定的 n 次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个 o |
{n,} | n 是一个非负整数。至少匹配 n 次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有 o。 |
{n,m} | m 和 n 均为非负整数,其中 n<=m。最少匹配 n 次且最多匹配 m 次 |
* | 匹配前面的子表达式零次或多次 |
+ | 匹配前面的子表达式一次或多次。 |
? | 匹配前面的子表达式零次或一次 |
. | 匹配除“\n”之外的任何单个字符 |
(pattern) | 匹配 pattern 并获取这一匹配的子字符串 |
[xyz] | 字符集合(character class)。匹配所包含的任意一个字符 |
[a-z] | 字符范围。匹配指定范围内的任意字符 |
[^xyz] | 排除型(negate)字符集合。匹配未列出的任意字符 |
[^a-z] | 排除型的字符范围。匹配任何不在指定范围内的任意字符 |
- 优先级
优先级为从上到下从左到右,依次降低:
运算符 | 说明 |
---|---|
\ | 转义符 |
(), (? : ), (?=), [] | 括号和中括号 |
*、+、?、{n}、{n,}、{n,m} | 限定符 |
^、$、\任何元字符 | 定位点和序列 |
| | 选择 |
grep 模式匹配命令
grep命令用于打印输出文本中匹配的模式串,
它使用正则表达式作为模式匹配的条件。
grep支持三种正则表达式引擎,分别用三个参数指定:
参数 | 说明 |
---|---|
-E | POSIX 扩展正则表达式,ERE |
-G | POSIX 基本正则表达式,BRE |
-P | Perl 正则表达式,PCRE |
grep命令常用参数:
参数 | 说明 |
---|---|
-b | 将二进制文件作为文本来进行匹配 |
-c | 统计以模式匹配的数目 |
-i | 忽略大小写 |
-n | 显示匹配文本所在行的行号 |
-v | 反选,输出不匹配行的内容 |
-r | 递归匹配查找 |
-A n | n 为正整数,表示 after 的意思,除了列出匹配行之外,还列出后面的 n 行 |
-B n | n 为正整数,表示 before 的意思,除了列出匹配行之外,还列出前面的 n 行 |
–color=auto | 将输出中的匹配项设置为自动颜色显示 |
使用:
查找/etc/group文件中以以mysql开头的行
grep '^mysql' /etc/group
将匹配以'z'开头以'o'结尾的所有字符串
echo 'zero\nzo\nzoo' | grep 'z.*o'
将匹配以'z'开头以'o'结尾,中间包含一个任意字符的字符串
echo 'zero\nzo\nzoo' | grep 'z.o'
将匹配以'z'开头,以任意多个'o'结尾的字符串
echo 'zero\nzo\nzoo' | grep 'zo*'
grep默认是区分大小写的,这里将匹配所有的小写字母
echo '1234\nabcd' | grep '[a-z]'
排除字符
echo 'geek\ngood' | grep '[^o]'
sed 流编辑器
用于过滤和转换文本的流编辑器
sed 命令基本格式:
sed [参数]... [执行命令] [输入文件]...
# 形如:
sed -i 's/sad/happy/' test # 表示将test文件中的"sad"替换为"happy"
参数 | 说明 |
---|---|
-n | 安静模式,只打印受影响的行,默认打印输入数据的全部内容 |
-e | 用于在脚本中添加多个执行命令一次执行,在命令行中执行多个命令通常不需要加该参数 |
-f | filename 指定执行 文件中的命令 |
-r | 使用扩展正则表达式,默认为标准正则表达式 |
-i | 将直接修改输入文件内容,而不是打印到标准输出设备 |
执行命令格式
[n1][,n2]command
[n1][~step]command
其中一些命令可以在后面加上作用范围,形如:
sed -i 's/sad/happy/g' test # g表示全局范围
sed -i 's/sad/happy/4' test # 4表示指定行中的第四个匹配字符串
其中 n1,n2 表示输入内容的行号,它们之间为,逗号则表示从 n1 到 n2 行,如果为~波浪号则表示从 n1 开始以 step 为步进的所有行;command 为执行动作,下面为一些常用动作指令:
命令 | 说明 |
---|---|
s | 行内替换 |
c | 整行替换 |
a | 插入到指定行的后面 |
i | 插入到指定行的前面 |
p | 打印指定行,通常与-n参数配合使用 |
d | 删除指定行 |
打印passwd 2-5行
nl passwd | sed -n '2,5p'
打印奇数行
nl passwd | sed -n '1~2p'
将输入文本中"ceshiti" 全局替换为"hehe",并只打印替换的那一行,
注意这里不能省略最后的"p"命令
sed -n 's/ceshiti/hehe/gp' passwd
删除第30行
sed -i '30d' passwd