leetcode中有几道关于命令行的问题,学习了一下
一、leetcode: 193. Valid Phone Numbers
Given a text file file.txt
that contains list of phone numbers (one per line), write a one liner bash script to print all valid phone numbers.
You may assume that a valid phone number must appear in one of the following two formats: (xxx) xxx-xxxx or xxx-xxx-xxxx. (x means a digit)
You may also assume each line in the text file must not contain leading or trailing white spaces.
For example, assume that file.txt
has the following content:
1 | 987-123-4567 |
Your script should output the following valid phone numbers:
1 | 987-123-4567 |
二、grep
grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。
Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
- grep在数据中查找一个字符串时,是以“整行”为单位进行数据筛选的。
- pattern如果是表达式或者超过两个单词的, 需要用引号引用. 可以是单引号也可双引号, 区别是单引号无法引用变量而双引号可以.
1、基本用法
1 | grep [option] '搜索字符串' filename |
常用选项:
- c:只输出匹配行的计数。
- I:不区分大小写(只适用于单字符)。
- h:查询多文件时不显示文件名。
- l:查询多文件时只输出包含匹配字符的文件名。
- n:显示匹配行及行号。
- s:不显示不存在或无匹配文本的错误信息。
- v:显示不包含匹配文本的所有行。
pattern正则表达式主要参数:
- \: 忽略正则表达式中特殊字符的原有含义。
- ^:匹配正则表达式的开始行。
- $: 匹配正则表达式的结束行。
- \<:从匹配正则表达式的行开始。
- \>:到匹配正则表达式的行结束。
- :单个字符,如[A]即A符合要求 。
- [ - ]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。
- .:所有的单个字符。
- *:有字符,长度可以为0。
2、应用
grep ‘\<Tom>‘ file 包含单词Tom的行
grep ‘Tom savage’ file 包含Tom savage的行
grep ‘^Tommy’ file 包含以Tommy开头的行
grep ‘.bak$’ file 包含以.bak结束的行
grep ‘[Pp]yramid’ file 包含pyramid 或Pyramid的单词的行
grep ‘[A-Z]’ file 包含至少一个大写字母的行
grep ‘[0-9]’ file 包含至少一个数字的行
grep ‘[A-Z]…[0-9]’ file 包含五个字符,以大写开头, 和一个数字结尾的行.
grep -w ‘[tT]est’ file 包含单词和test的行.
grep -s ‘ken sun’ file 找到包含ken sun的行, 但不打印行, 而是用来检查退出状态.
grep -v aaa file 打印不包含aaa的行.
grep -i cathy file 打印所有包含cathy的行, 而不考虑大小些.
grep -l ‘dear cathy’ * 打印包含dear cathy的文件的文件名清单.
grep -n tom file 打印匹配的行并追加行号.
grep “$LOGNAME” file 包含变量内容的行, 注意必须用双引号, 单引号则无法引用变量.
grep ‘$name’ file 打印包含字符\$name的行.
3、leetcode答案
1 | grep '^\(([0-9]\{3\}) \|[0-9]\{3\}-\)[0-9]\{3\}-[0-9]\{4\}$' file.txt |
三、egrep
1、基本用法
egrep = grep -E 可以使用基本的正则表达外, 还可以用扩展表达式. 注意区别.
扩展表达式:
- 匹配一个或者多个先前的字符, 至少一个先前字符.
- ? 匹配0个或者多个先前字符.
- a|b|c 匹配a或b或c
- () 字符组, 如: love(able|ers) 匹配loveable或lovers.
- (..)(..)\1\2 模板匹配. \1代表前面第一个模板, \2代第二个括弧里面的模板.
- x{m,n} =x{m,n} x的字符数量在m到n个之间.
2、应用
egrep ‘^+’ file 以一个或者多个空格开头的行.
grep ‘^‘ file 同上
egrep ‘(TOM|DAN) SAVAGE’ file 包含 TOM SAVAGE 和DAN SAVAGE的行.
egrep ‘(ab)+’ file 包含至少一个ab的行.
egrep ‘x[0-9]?’ file 包含x或者x后面跟着0个或者多个数字的行.
egrep ‘fun.$’ 所有文件里面以fun.结尾的行.
egrep ‘[A-Z]+’ file 至少包含一个大写字母的行.
egrep ‘[0-9]’ file 至少一个数字的行.
egrep ‘[A-Z]…[0-9]’ file 有五个字符, 第一个式大写, 最后一个是数字的行.
egrep ‘[tT]est’ file 包含单词test或Test的行.
egrep ‘ken sun’ file 包含ken sun的行.
egrep -v ‘marry’ file 不包含marry的行.
egrep -i ‘sam’ file 不考虑sam的大小写,含有sam的行.
egrep -l “dear ken” * 包含dear ken的所有文件的清单.
egrep -n tom file 包含tom的行, 每行前面追加行号.
egrep -s “$name” file 找到变量名\$name的, 不打印而是显示退出状态. 0表示找到. 1表示表达式没找到符合要求的, 2表示文件没找到.
3、leetcode答案
1 | grep '^\(([0-9]\{3\}) \|[0-9]\{3\}-\)[0-9]\{3\}-[0-9]\{4\}$' file.txt |
两个都可以,可以看出和基本正则的区别。