Unix 不会阻止用户干蠢事,因为那样也会妨碍用户做聪明的事。
Linux grep,sed 常用语文本的搜索和处理,所以下面也基本通过这两个命令,练习regexp patterns.
基础
- grep -n "string" data.txt #最简单的正则使用,就是查询string字符串,-n 打印行号
量词-出现的次数
- + 出现次数>0, => {1,}
- * 出现次数>=0. => {0,}
- ? 出现次数0,1或指明一个非贪婪限定符 => {0,1}
- {n} 匹配确定的 n 次。非负整数
- {n,} 至少匹配n 次。
- {n,m} 最少匹配 n 次且最多匹配 m 次。注意在逗号和两个数之间不能有空格。
eg:
1. grep -P "a+" data.txt #a出现的次数>1, -P 采用perl regexp模式,不然无法使用d
2. grep -P "a*" data.txt #a出现的次数>0
3. grep -P "a?" data.txt #a出现的次数0,1
4. grep -P "a{2}" data.txt #a只连续2次的
5. grep -P "a{2,}" data.txt #a至少连续2次的
5. grep -P "a{2,4}" data.txt #a至少连续2次的, 最多4次
Note: *+?
量词都是贪婪的,因为它们会尽可能多的匹配内容(后面有记录)。
括号表达式() [] {}
eg:
1. grep -P "(wrod)" data.txt #查询word
2. grep -P "(wrod){2}" data.txt #查询word连续出现2次
3. grep -P "(wrod1|word2)" data.txt #查询word1 or word2, `|` 指明两项之间的一个选择。
4. grep -P "[asd|jkl]" data.txt #查询a,s,k,|,j,k,l字符,注意这里|不是或的意思。
5. grep -P "[02468]" data.txt #只匹配0,2,4,6,8
6. grep -P "[d]" data.txt #[d] => [0-9] => [0123456789]
7. grep -P "[D]" data.txt #[D] => `[^0-9]` => `[^d]` 匹配非数字内容,^在[]起始位置,表示不匹配[]内部的内容
8. grep -P "[w]" data.txt #匹配单词字符,也就是英文单词的组成成分,字母数字下划线 => `[^A-Za-x0-9]`, `[W]`就是非单词字符 => `[^_A-Za-z0-9]`
或,并集和差集
eg:
1. echo "2345678901234563452" | grep -P "[0-3,6-9]" #0-3 || 6-9
1. echo "2345678901234563452" | grep -P "[0-36-9]" #也可以
2. man ls | grep -P "[a-f,x-y]" #并集
3. 差集待续...
定位符
- ^ 字符串的开始,对于文本来说,一行内容就是一个字符串。
- $ 字符串的结束
- 匹配一个字边界,即字与空格间的位置。
- B 非字边界匹配。
对于 ^ and $, 使用vim的就非常熟悉了。
Note: 不能将限定符与定位符一起使用。
eg:
1. grep -P "^a" data.txt #字符串的以a开头
2. grep -P "^abc" data.txt #字符串的以abc开头 => `^(abc)`
3. grep -P "^(abc|def)" data.txt#字符串的以abc 或 def开头
4. grep -P "(abc|def)$" data.txt#字符串的以abc 或 def结尾
5. grep -P " $" data.txt #字符串的以 空格 结尾
^$是针对于一个字符串,一个字符串中含有很多单词, B就是对单词进行匹配的。
1. grep -P "a" data.txt #以a开头的单词,a,as,and,also,...
2. grep -P "a" data.txt #以a结尾的单词, a,data,meta ....
3. grep -P "s[w]+e" data.txt #以s开头,e结尾的单词,some,single,style,....
4. grep -P "Bee" data.txt #非单词边界,也就是单词中。 单词中含有ee的,three,needed,See,green...单词中,就不分单词的开始和结束了 => `eeB`
5. grep -P "[1][02468]" data.txt # 10-19的偶数
6. grep -P "[02468]|[1-9][02468]" data.txt # 0-99的偶数
其他字符
- . 匹配除 " " 之外的任何单个字符。要匹配包括 ' ' 在内的任何字符,请使用像"(.| )"的模式。
eg:
1. grep -P ".*" data.txt # => `[^
]` => `[^
]`
2. grep -P ".+" data.txt
元字符的字面值,一方面可以使用进行转义为普通字符,另一方面可以用QE把元字符包括起来,eg:Q$E,表达式将匹配$的字面值。
非打印字符
-
a 报警字符
-
[] 退格字符
-
cx 匹配由x指明的控制字符。
cM 匹配一个 Control-M 或回车符。
x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。 -
f 匹配一个换页符。等价于 x0c 和 cL。
-
匹配一个换行符。等价于 x0a 和 cJ。
-
匹配一个回车符。等价于 x0d 和 cM。
-
匹配一个制表符。等价于 x09 和 cI。
-
s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ f v]。
-
S 匹配任何非空白字符。等价于 [^ f v]。
-
v 匹配一个垂直制表符。等价于 x0b 和 cK。
-
V 非垂直制表符
-
h 水平空白符
-
H 非水平空白符