已索引
通配符(Path Name Expansion)
对多个文件名进行操作,例如 ls, rm, cp 等,使用的是通配符。例如:
[!b]??[[:digit:]][[:digit:]]*
表示:文件名不以 b 开头,然后两个任意符号,然后再两个数字,后面任意字符的文件名
正则表达式(Regular Expression,RE)
正则表达式用于对文件内容进行处理,需要工具的支持,Linux 三剑客: awk, sed, grep 均支持正则表达式。
注意事项:
- 最好用 "" 将正则表达式括起来,否则可能达不到想要的效果。
- $ export LC_ALL=C <-- 如果不调整,有时候会出现问题。To obtain the traditional interpretation of bracket expressions, you can use the C locale by setting the LC_ALL environment variable to the value C.
基础正则(BRE)
表达式 | 含义 | 范例 |
word | exact word | hello |
. | Any single character | h.t |
[ ] | Any single character in the brackets | [ab2], [a-c0-2], [a.^7] |
[^ ] | Any single character not in the brackets | [^ab2], [^a-c0-2], [^a.^7] |
^ | beginning of line | ^Hello |
$ | end of line | test.$ |
* | zero or more of the previous character | ho*t, h[aeiou]*t |
\ | the following character is leteral | test\.$ |
.* | zero or more of any character | Test.*ing. |
pattern{n,m} | n to m of the previous character | go{2,4}d |
几点说明:
- 在[]里面,如果有多个不连续的范围,可以直接挨着写,也可以用逗号隔开;括号里面的内容,除了第1个 ^ 表示取反外,其它字符没有特殊含义
- {n,m} 注意要使用转义符(egrep,grep -E,sed -r 不需要转义), "n" 只有n次, "n," 至少 n 次, ",m" 最多 m 次, "n,m" n 到 m 次.
扩展正则(ERE)
表达式 | 含义 | 范例 |
+ | one or more of the previous character | ^[a-Z0-9]+$ |
? | zero or one of the previous character | boa?t |
l | or | 'ORA-lerror' |
() | 元组,表示一个整体 | 'A(xyz)+C' |
关于元组的说明:
元组表示一个整体,可以对小组整体使用 + ? * 等,例如,A开头,C结尾,中间有至少一个(xyz)的串,可以这样:'A(xyz)+C'。
再如, 如果想找包含 good 或者 glad 的单词, 如果这样写 : g'oo|la'd 是不行的, 这样会解释成 goo 或 lad, 需要这样写 'g(la|oo)d', 表示 (la|oo) 是一个整体,要么是 la, 要么是 oo. egrep "(st|ST)$" 表示st结尾或者ST结尾的行, grep "(st)|(ST)$" 表示 包含(st) 的行 或者 (ST结尾)的行.
再如,我们使用semanage修改SELinux 策略时:
# semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?"
这里元组()和?合用,表示没有元组(目录本身)或者只有一个元组(目录下内容)。再来,有了元组,我们还可以去引用匹配,例如:
# egrep "([a-z])([a-z])
.*\2
\1" demo.txt <-- \2 和 \1 分别表示前面的第2次和第1次匹配
ab
c134xxoobaxxoob
a <-- 最长匹配原则(贪婪模式)
abcgoo
gle
POSIX字符类(Common Regex Character Classes)
表达式 | 含义 |
[:alnum:] | 匹配任意一个字母或者数字字符 |
[:alpha:] | 匹配任意一个字母字符 |
[:blank:] | 匹配任意一个数字字符 |
[:digit:] | 匹配任意一个数字字符 |
[:lower:] | 匹配小写字母 |
[:upper:] | 匹配大写字母 |
[:punct:] | 匹配标点符号 |
[:space:] | 匹配一个包括换行符、回车等在内的所有空白符 |
[:graph:] | 匹配任何一个可见且可打印的字符 |
[:xdigit:] | 任何一个十六进制数(即0-9,a-f,A-F) |
[:cntrl:] | 任何一个控制字符(ASCI字符集中的前32个字母) |
[:print:] | 任何一个可打印字符 |
元字符(meta charactor)
一种 perl 风格的正则表达式,只有一部分文本处理工具支持。
\b 单词边界,例如 grep "boy\b" 将抓取 boy 的行,而不会抓取 boygood 的行。
\B 非单词边界,例如 grep "boy\B" 将抓取 boygood 的行,而不会抓取 boy 的行
\d 单个数字字符, \D 单非数字字符
\w 单单词字符(字母、数字与_), \W 单个非单词字符
\s 单个空白字符, \s 单个非空白字符
\n 换行符,匹配一个新行, \r 回车
\t 横向制表符, \v 垂直制表符
\f 换页符
linux里换行是 \n, windows换行 \r\n