Shell正则表达式与模式匹配
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
模式匹配
参数扩展还包括了一些模式匹配功能,该功能带有在文件名扩展或globbing 中使用的通配符功能。
注意:这不是grep 使用的正则表达式匹配。
表2. Shell 扩展模式匹配扩展目的
${PARAMETER#WORD} shell 像文件名扩展中那样扩展WORD,并从PARAMETER 扩展后的值的开头删除最短的匹配模式(若存在匹配模式的话)。
使用‘@’或‘$’即可删除列表中每个参数的模式。
${PARAMETER##WORD} 导致从开头删除最长的匹配模式而不是最短的匹配模式。
${PARAMETER%WORD} shell 像文件名扩展中那样扩展WORD,并从PARAMETER 扩展后的值末尾删除最短的匹配模式(若存在匹配模式的话)。
使用‘@’或‘$’即可删除列表中每个参数的模式。
${PARAMETER%%WORD} 导致从末尾删除最长的匹配模式而不是最短的匹配模式。
${PARAMETER/PATTERN/STRING} shell 像文件名扩展中那样扩展PATTERN,并替换PARAMETER 扩展后的值中最长的匹配模式(若存在匹配模式的话)。
为了在PARAMETER 扩展后的值开头匹配模式,可以给PATTERN 附上前缀#,如果要在值末尾匹配模式,则附上前缀%。
如果STRING 为空,则末尾的/ 可能被忽略,匹配将被删除。
使用‘@’或‘$’即可对列表中的每个参数迚行模式替换。
${PARAMETER//PATTERN/STRING} 对所有的匹配(而不只是第一个匹配)执行替换。
清单11 给出了模式匹配扩展的一些基本用法。
清单11. 模式匹配示例
[ian@pinguino ~]$ x="a1 b1 c2 d2"
[ian@pinguino ~]$ echo ${x#*1}
b1 c2 d2
[ian@pinguino ~]$ echo ${x##*1}
c2 d2
[ian@pinguino ~]$ echo ${x%1*}
a1 b
[ian@pinguino ~]$ echo ${x%%1*}
[ian@pinguino ~]$ echo ${x/1/3}
a3 b1 c2 d2
[ian@pinguino ~]$ echo ${x//1/3}
a3 b3 c2 d2
[ian@pinguino ~]$ echo ${x//?1/z3}
z3 z3 c2 d2
-------------------------------------------
正则表达式元字符
Shell命令模式匹配:(命令结束符;空命令:)
1. *表示0-多个字符
2. ?表示一个字符。
3. [a-m1-9]表示匹配a-m或1-9之间的任何一个字符。
4. [!a-kw-z]表示匹配除了a-k或w-z的一个字符。
正则表达式模式匹配:(匹配字符、字符串、行)
1. .表示匹配任何单个字符。
2. [^a-kw-z]表示匹配除了a-k或w-z的一个字符。
3. /…/表示模式,每种模式都要放在//中。
4. /表示重复上次搜索。
msg=""
msgg="${msg//./_}" -->www_qq_com
5. …/…表示查找并替换。
6. ^表示跟一行的行首迚行、匹配。
7. $表示跟一行的行尾迚行匹配。
8. \表示转义,要与正则表达式中表示特殊意义的字符惊醒匹配,需要该斜杠。
9. ^$表示匹配不含字符的行。
10. [a-m1-9]表示匹配a-m或1-9之间的任何一个字符。
11. [!a-kw-z]表示匹配除了a-k或w-z的一个字符。
12. *匹配0或多个*靠近的前面的字符。
13. .*表示匹配0个或多个任意字符。
匹配哦个或多个.用\.*。
14. [-0-9]把连字符-当作匹配字符。
15. [^]a-m]把]字符当作匹配字符。
16. \{min,max\}表示精确匹配,精确匹配连续的min-max前面出现的字符。
17. \(…\)保存匹配的字符串,把匹配的字符或字符串保存到编号为1-9的寄存器中,用\n来引用寄存器的内容,n为0-9.
18. ^\(…\)\(…\)表示行中头三个字符存在1号寄存器中,接着三个存在2号寄存器中。
19. /\(.*\) \(.*\)/\2 \1/表示交换包含制表符两个字段。
20. /…/g中g表示对每行中的匹配都迚行处理。
21. 字符/…/ 中“字符”表示
22. ‘’可以去掉表示特殊意义的字符多具有的特使意义。
23. “”与‘’相似,但$,``(反引号),\三中特殊符不被忽略。
24. 引号可把含有空格的字符串看作整体参数传入作为$n,在使用该参数时要做变量替换。
所以要一直传下去,就要用“$n”防止变量暂时替换。
---------------------------------------------
元字符
功能
示例
匹配对象
^
行首定位符
/^man/
匹配所有以man开头的行
$
行尾定位符
/man$/
匹配所有以man结尾的行
.
匹配单个字符
/m..n/
匹配包含一个m,后跟两个字符,再跟一个n的行
*
匹配0个或多个重复的位于星号前的字符
/*man/
匹配包含跟在0个或者多个空格的模式的man的行
[]
匹配一组字符中任一个
/[Mm]an/
匹配包含Man或man的行
[x-y]
匹配指定范围内的一个字符
/[A-Z]an/
匹配后面跟着an的一个A至Z之间的字符
[^]
匹配不在指定组内的字符
/[^A-Z]/
匹配不在范围A至Z之间的任意一个字符
\
用来转义元字符
/man\./
匹配包含man,后面跟一个点(如果不转义的话则是匹配一个任意字符)
\
词首定位符
/\
匹配包含以man开头的词的行(vi和grep支持)
\>
词首定位符
/man\>/
匹配包含以man结尾的词的行(vi和grep支持)
\(..\)
匹配稍后将要使用的字符的标签
s/\(man\)
acle/\1age/g
最多可以使用9个标签,模式中最左边的标签是第一个。
例如,模式man被保存为标签1,用\1表示。
左边这个例子中,查找manacle,把它替换成manage(sed、vi和grep 支持)
x\{m\}或
x\{m,\}或
x\{m,n\}
字符x的重复出现:m次、至少m次、至少m次且不超过n次
n\{3,5\}
匹配包含3~5个连续的字母n的行。