搜尋此網誌

2010年12月28日 星期二

bash学习笔记(一)——正则表达式

脚本第一行的#!
由于系统拥有好几个shell,因此需要通过一种方式告知UNIX内核应该以哪个shell来执行指定的shell脚本。指定方法是,通过脚本文件中特殊的第一行来设置,如:#!/bin/bash。

重定向
<: 改变标准输入 >: 改变标准输出,如果存在同名文件则覆盖,不存在则创建

tr -d 'a' < tmp1.txt > tmp2.txt, 此命令表示用tmp1作为输入执行tr -d命令并将结果输出到tmp2中。

>>: 作用同>,但其不会覆盖同名文件而是追加。

|:管道连接符,可将不同的命令连接起来。

Shell脚本参数
shell脚本的命令行参数都是由整数命名,当它超过9,就应该用大括号把数字框起来。例:

#!/bin/bash
echo first arg is $1
echo tenth arg is ${10}
如需要调试脚本,可在#!/bin/bash后加上 -x/+x来打开/关闭跟踪功能。


正则表达式
metacharacter:
\
将下一个字符标记为一个特殊字符、或一个原义字符、或一个 后向引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 '\\' 匹配 "\" 而 "\(" 则匹配 "("。

^
匹配输入字符串的开始位置。

$
匹配输入字符串的结束位置。

*
匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。 * 等价于{0,}。

+
匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。

?
匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。

[]
匹配括号中的一个字符。例,[abc]表示匹配a,b或c

\(\)
将\(与\)间的模式存储在保留空间。最多可将9个独立的子模式存储在单个模式中。匹配于子模式的文本,可通过转义序列\1至\9被重复使用在相同模式里。例如,\(ab\)\(cd\)*\2\1,表示abcd*cdab。 \(["']\).*\1,表示""和''。

\{n,m\}

区间表达式,匹配在它前面的单个字符重现的次数区间。\{n\}指重现n次;\{n,\}指至少重现n次;\{n,m\}指重现n至m次。n,m的值必须介于0-255。



POSIX 字符类. [:class:]

这是另外一个可选的用于指定匹配字符范围的方法。

*

[:alnum:] 匹配字母和数字.等同于A-Za-z0-9.
*

[:alpha:] 匹配字母. 等同于A-Za-z.
*

[:blank:] 匹配一个空格或是一个制表符(tab).
*

[:cntrl:] 匹配控制字符.
*

[:digit:] 匹配(十进制)数字. 等同于0-9.
*

[:graph:] (可打印的图形字符). 匹配 ASCII 码值的33 - 126之间的字符. 这和下面提到的 [:print:]一样,但是不包括空格字符.
*

[:lower:] 匹配小写字母. 等同于a-z.
*

[:print:] (可打印字符). 匹配 ASCII码值 32 - 126之间的字符. 这和上面提到的一样[:graph:], 但是增多一个空格字符。
*

[:space:] 匹配空白字符 (空格符和水平制表符).
*

[:upper:] 匹配大写字母. 等同于A-Z.
*

[:xdigit:] 匹配十六进制数字. 等同于0-9A-Fa-f.

POSIX字符类一般都要求用[[ ]]引起来, 如: grep [[:digit:]] test.txt

沒有留言:

張貼留言