正则表达式
界定符
表示一个正则表达式的开始和结束
/[0-9]/ or #[0-9]# or {[0-9]}
正则表达式工具
regexpal
原子
可见原子
Unicode编码表中用键盘输出后肉眼可见的字符有哪些?
- 标点; “ _ ? .等等
- 英文字母数字a-z,A-Z,0-9
- 汉字、日文、阿拉伯文等其他语言文字
- ∑,∈,∮,≌等数理化公式符号
- 其他可见字符
不可见原子
Unicode编码表中用键盘输出后肉眼不可见的字符有哪些?
- 换行符\n
- 回车\r
- 制表符\t
- 空格
- 其他不可见符号
元字符
原子的筛选方式
- | 匹配两个或者多个分支选择
- [] 匹配方括号中的任意一个原子
- [^] 匹配除方括号中的原子之外的任意字符
原子的集合
- . 匹配除换行符之外的任意一个字符
- \d 匹配任意一个十进制数字,即[0-9]
- \D 匹配任意一个非十进制数字,即[^0-9]
- \s 匹配任意一个不可见原子,即[\f\n\r\t\v]
- \S 匹配任意一个可见原子,即[^\f\n\r\t\v]
- \w 匹配任意一个大小写字母、数字或下划线,即[0-9a-zA-Z_]_
- \W 匹配任意一个非大小写字母、数字或下划线,即[^0-9a-zA-Z_]
量词
- {n} 表示其前面的原子出现n次
- {n,} 表示其前面的原子最少出现n次
- {n,m} 表示其前面的原子最少出现n~m次
- * 匹配0次或者多次其之前的原子,即{0,}
- + 匹配1次或者多次其之前的原子,即{1,}
- ? 匹配0次或者1次其之前的原子,即{0,1}
边界控制与模式单元
- ^ 匹配字符串开始的位置
- $ 匹配字符串结尾的位置
- () 匹配其中的整体为一个原子
修正模式
- 贪婪匹配(u,默认)和懒惰匹配(U)
- 贪婪模式
- 匹配结果存在歧义时取其长
懒惰模式
匹配结果存在歧义时取其短
常见修正模式
U/u[默认] - 懒惰匹配/贪婪匹配
i - 忽略英文字母大小写
x - 忽略空白符
s - 让元字符’.’匹配包括换行符在内的任意字符
实战
匹配手机号: ^1[34578]\d{9}$ 或者 ^1(3|4|5|7|8)\d{9}$
email: ^[\w\.]+@\w+(\.\w+)+$
url: ^(https?:\/\/)?\w+(\.\w)+$
PHP中常用的正则表达式函数
preg_match($pattern, $subject[, array &$matches])
preg_match_all($pattern, $subject, array &$matches)
preg_replace($pattern, $replacement, $subject)
preg_filter($pattern, $replacement, $subject)
preg_grep($pattern, array $input)
preg_split($pattern, $subject)
preg_quote($str)
正则运算符转义
. \ + * ? [ ^ ] $ () {} = ! < > | : -
总结:
1.都是以preg_开头
2.除了preg_quote以外,第一个参数都是正则表达式
3.preg_match-表单验证等
4.preg_replace-非法词语过滤等
Shell编程之正则表达式
正则表达式
1.正则表达式是什么?
正则表达式是用于秒数字符排列和匹配模式的一种语法规则。它主要用于字符串的模式分割、匹配、查找和替换操作。
2.正则表达式与通配符
l 正则表达式是用来在文件中匹配符合条件的字符串,正则是包含匹配。grep、awk、sed 等命令可以支持正则表达式。
l 通配符用来匹配符合条件的文件名,通配符是完全匹配。ls、find、cp这些命令不支 持正则表达式,所以只能使用shell自己的通配符来进行匹配了。
l 通配符
¡ * 匹配任意内容
¡ ? 匹配任意一个内容
¡ [] 匹配中括号中的一个字符
3.基础正则表达式
3.1“*” 前一个字符匹配0次或多次
- “a*”
匹配所有的内容,包括空白行
- “aa*”
匹配至少包含有1个a的行
- “aaa*”
匹配至少包含有连续2个a的行
- “aaaaa*”
匹配至少包含有连续4个a的行
3.2“.” 匹配出换行符之外的任意一个字符
- “s..d”
匹配在s和d之间一个会有2个字符的单词
- “s.*d”
匹配在s和d之间有任意字符
- “.*”
匹配所有内容
3.3“^” 匹配行首,“$” 匹配行尾
- “^M”
匹配以大写M开头的行
- “n$”
匹配以小写n结尾的行
- “^$”
匹配空白行
3.4“[]” 匹配中括号中指定的任意一个字符,只匹配一个字符
- “s[ao]id”
匹配s和i字母中,要么是a,要么是o
- “[0-9]”
匹配任意一个数字
- “^[a-z]”
匹配以小写字母开头的行
3.5“[^]” 匹配出中括号的字符以外的任意一个字符
- “^[^a-z]”
匹配不以小写字母开头的行
- “^[^a-zA-Z]”
匹配不以字母开头的行
3.6“\” 转义符
- “.$”
匹配使用.结尾的行
3.7“{n}” 表示其前面的字符恰好出现n次
- “a{3}”
匹配小写字母a连续出现3次的字符串
- “[0-9]{3}”
匹配包含连续的3个数字的字符串
3.8“{n,}” 表示其前面的字符出现至少n次
- “^[0-9]{3,}[a-z]”
匹配最少以连续3个数字开头的行
3.9几个例子
- [0-9]{4}-[0-9]{2}-[0-9]{2}
匹配日期格式YYYY-MM-DD
- [0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}
匹配IP地址
字符截取命令
cut字段提取命令
printf命令
Printf ‘输出类型输出格式’ 输出内容
输出类型
%ns: 输出字符串。n是数字,指输出几个字符
%ni: 输出整数。n是数字,指输出几个数字
%m.nf: 输出浮点数。m和n是数字,指输出的整数位数和小数位数。如%8.2f代表共输出8位数,其中2位是小数,6位是整数。
输出格式
- \a: 输出警告声音
- \b: 输出退格键,即backspace键
- \f: 清除屏幕
- \n: 换行
- \r: 回车,即enter键
- \t: 水平制表符
- \v: 垂直制表符
printf ‘%s’ $(cat students.txt)
- 不调整输出格式
- printf ‘%s\t%s\t%s\t%s\n’ $(cat students.txt)
- 调整输出格式
在awk命令的输出中支持print和printf命令
- print: print会在每个输出之后自动加入一个换行符(Linux默认没有print命令)
- printf: printf是标准格式输出命令,并不会自动加入换行符,若需要换行,需要手动加入换行符。
awk命令
awk ‘条件1{动作1}条件2{动作2}…’ 文件名
条件(pattern):
- 一般使用关系表达式作为条件
- X>10,判断变量x是否大于10
- X>=10,判断变量x是否大于或等于10
- X<=10,判断变量x是否小于或等于10
动作(action):
- 格式化输出
- 流程控制语句
Begin
- awk ‘BEGIN{printf “This is a transcript \n”}{printf $2 “\t” $4 “\n”}’ students.txt
End
- awk ‘END{printf “The End \n”}{printf $2 “\t” $4 “\n”}’ students.txt
FS内置变量
- cat /etc/passwd | grep “/bin/sh” | awk ‘BEGIN{FS=”:”}{printf $2 “\t” $4 “\n”}’
关系运算符
- Cat students.txt | grep -v Name | awk ‘$4 >= 70{printf $2 “\n”}’
sed命令
sed是一种几乎包括在所有Unix平台(包括Linux)的轻量级流编辑器。sed主要是用来将数据进行选取、替换、删除、新增的命令。
sed [选项] ‘动作’ 文件名
- 选项:
n -n: 一般sed命令会把所有的数据都输出到屏幕,若加入此选项,则只会把经过sed命令处理的行输出到屏幕
n -e: 允许对输出数据引用多条sed命令编辑
n -i: 用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出
- 动作:
n a: 追加。在当前行后添加一行或多行
n c: 行替换,用c后面的字符串替换原数据行
n i: 插入。在当前行前插入一行或多行。d: 删除,删除指定的行
n p: 打印。输出指定的行
n s: 字符替换。用一个字符串替换另外一个字符串。格式为”行范围s/旧字串/新字串/g”(和vim中的替换格式类似)
行数据操作
- sed ‘2p’ student.txt
- n 查看文件的第二行
- sed -n ‘2p’ student.txt
- sed ‘2,4d’ student.txt
- n 删除第二行到第四行的数据,但不修改文件本身
- sed ‘2a hello’ student.txt
- n 在第二行后追加hello
- sed ‘2i hello’ student.txt
- n 在第二行前插入hello
- sed ‘2c furong bujige’ student.txt
- n 数据替换
- sed ‘2p’ student.txt
字符串替换
- sed ‘s/旧子串/新字串/g’ 文件名
- sed ‘3s/60/99/g’ student.txt
- n 在第三行中,将60替换成90
- sed -i ‘3s/60/99/g’ student.txt
- n sed操作的数据直接写入文件
- sed -e ‘s/fengj//g; s/cang//g’ student.txt
- n 同时把“fengj”和“cang”替换为空
字符处理命令
排序命令sort
Sort [选项] 文件名
选项
- -f: 忽略大小写
- -n: 以数值型进行排序,模式使用字符串型排序
- -r: 反向排序
- -t: 指定分隔符,默认分隔符是制表符
- -k n[,m]: 按照指定的字段范围排序。从第n个字段开始,m个字段结尾(默认到行尾)。
sort /etc/passwd
- 排序用户信息文件
sort -r /etc/passwd
- 反向排序
sort -t “:” -k “3,3” /etc/passwd
制定分隔符是“:”,用第三个字段开头,第三个字段结尾排序,即只用第三个字段排序。
sort -n -t “:” -k “3,3” /etc/passwd
统计命令wc
wc [选项] 文件名
选项
- -l: 只统计行数
- -w: 只统计单词数
- -m: 只统计字符数