SHELL SED AWK 语法

原文地址:http://blog.chinaunix.net/uid-15811445-id-176318.htmlhtml

Shellgit

shell 测试表达式正则表达式

-a file 检查文件是否存在(与-e同)shell

-b file 检查文件是否为特殊块设备编程

-c file 检查文件是否为特殊字符设备centos

-d fil 检查文件是否为目录数组

-e file 检查文件是否存在(与-a同)bash

-g file 检查文件属性位set- group-id是否置1socket

-h file 检查文件是否为符号连接(与-L 同)函数

-k file 检查文件是否设置了粘滞位(sticky bit)

-L file 检查文件是否为符号连接(与-h同)

-n string 检查字符串长度是否大于0字节

-O file 检查用户是否拥有该文件

-p file 检查文件是否为命名管道

-r file 检查文件(对用户)是否可读

-s file 检查文件是否存在且长度大于0字节

-S file 检查文件是否存在且为套接字(socket)

-t fd 检查文件描述符是否与终端相关联

-u file 检查文件属性位set-user-id是否置1

-w file 检查文件(对用户)是否可写

-x file 检查文件(对用户)是否可执行

-z string 检查字符串长度是否为0字节

expr1 -a expr2 检查两个表达式是否皆为真

expr1 -o expr2 检查两个表达式是否至少有一个为真

file1 -nt file2 检查第一个文件是否比第二个文件新(利用修改时间戳比较)

file1 -ot file2 检查第一个文件是否比第二个文件旧(利用修改时间 戳比较)

file1 -ef file2 检查两个文件是否由连接关联在一块儿(硬连接或符号连接)

var1 = var2 检查第一个变量与第二个变量是否相等

var1 -eq var2 检查第一个变量与第二个变量是否相等

var1 -ge var2 检查第一个变量是否大于或等于第二个变量

var1 -gt var2 检查第一个变量是否大于第二个变量

var1 -le var2 检查第一个变量是否小于或等于第二个变量

var1 -lt var2 检查第一个变量是否小于第二个变量

var1 != var2 检查第一个变量是否不等于第二个变量

var1 -ne var2 检查第一个变量是否不等于第二个变量

AWK

1、AWK运算符介绍
赋值运算符
= += -= *= /= %= ^= **=     赋值语句
逻辑运算符
||     逻辑或
&&     逻辑与
正则运算符
~ ~!     匹配正则表达式和不匹配正则表达式
关系运算符
< <= > >= != ==     关系运算符
算术运算符
+ -     加,减
* / &     乘,除与求余
+ - !     一元加,减和逻辑非
^ ***     求幂
++ --     增长或减小,做为前缀或后缀
其它运算符
$     字段引用
空格 字符串链接符
?:     C条件表达式
in     数组中是否存在某键值
说明:awk运算符基本与c语言相同。表达式及功能基本相同
2、实例介绍
awk赋值运算符
a+=5; 等价于:a=a+5; 其它同类
awk逻辑运算符
[@localhost ~]$ awk 'BEGIN{a=1;b=2;print (a>5 && b<=2),(a>5 || b<=2);}'
0 1
awk正则运算符
[@localhost ~]$ awk 'BEGIN{a="100testa";if(a ~ /^100*/){print "ok";}}'
ok
awk关系运算符
如:> < 能够做为字符串比较,也能够用做数值比较,关键看操做数若是是字符串 就会转换为字符串比较。两个都为数字 才转为数值比较。字符串比较:按照ascii码顺序比较。
[@localhost ~]$ awk 'BEGIN{a="11";if(a >= 9){print "ok";}}'
[@localhost ~]$ awk 'BEGIN{a=11;if(a >= 9){print "ok";}}' 
ok
awk算术运算符
说明,全部用做算术运算符 进行操做,操做数自动转为数值,全部非数值都变为0。
[@localhost ~]$ awk 'BEGIN{a="b";print a++,++a;}'
0 2
其它运算符
?:运算符
[@localhost ~]$ awk 'BEGIN{a="b";print a=="b"?"ok":"err";}'
ok
in运算符
[@localhost ~]$ awk 'BEGIN{a="b";arr[0]="b";arr[1]="c";print (a in arr);}'
0
[@localhost ~]$ awk 'BEGIN{a="b";arr[0]="b";arr["b"]="c";print (a in arr);}'
1

3、awk Extended Regular Expression (ERES)基础表达式符号介绍
字符 功能
+  指定若是一个或多个字符或扩展正则表达式的具体值(在 +(加号)前)在这个字符串中,则字符串匹配。命令行:
awk '/smith+ern/' testfile
将包含字符 smit,后跟一个或多个 h 字符,并以字符 ern 结束的字符串的任何记录打印至标准输出。此示例中的输出是:
smithern, harry smithhern, anne
?  指定若是零个或一个字符或扩展正则表达式的具体值(在 ?(问号)以前)在字符串中,则字符串匹配。命令行:
awk '/smith?/' testfile
将包含字符 smit,后跟零个或一个 h 字符的实例的全部记录打印至标准输出。此示例中的输出是:
smith, alan smithern, harry smithhern, anne smitters, alexis
|  指定若是以 |(垂直线)隔开的字符串的任何一个在字符串中,则字符串匹配。命令行:
awk '/allen | alan /' testfile
将包含字符串 allen 或 alan 的全部记录打印至标准输出。此示例中的输出是:
smiley, allen smith, alan
( ) 在正则表达式中将字符串组合在一块儿。命令行:
awk '/a(ll)?(nn)?e/' testfile
将具备字符串 ae 或 alle 或 anne 或 allnne 的全部记录打印至标准输出。此示例中的输出是:
smiley, allen smithhern, anne
{m} 指定若是正好有 m 个模式的具体值位于字符串中,则字符串匹配。命令行:
awk '/l{2}/' testfile
打印至标准输出
smiley, allen
{m,} 指定若是至少 m 个模式的具体值在字符串中,则字符串匹配。命令行:
awk '/t{2,}/' testfile
打印至标准输出:
smitters, alexis
{m, n} 指定若是 m 和 n 之间(包含的 m 和 n)个模式的具体值在字符串中(其中m <= n),则字符串匹配。命令行:
awk '/er{1, 2}/' testfile
打印至标准输出:
smithern, harry smithern, anne smitters, alexis
[String] 指定正则表达式与方括号内 String 变量指定的任何字符匹配。命令行:
awk '/sm[a-h]/' testfile
将具备 sm 后跟以字母顺序从 a 到 h 排列的任何字符的全部记录打印至标准输出。此示例的输出是:
smawley, andy
[^String] 在 [ ](方括号)和在指定字符串开头的 ^ (插入记号) 指明正则表达式与方括号内的任何字符不匹配。这样,

命令行:
awk '/sm[^a-h]/' testfile
打印至标准输出:
smiley, allen smith, alan smithern, harry smithhern, anne smitters, alexis
~,!~   表示指定变量与正则表达式匹配(代字号)或不匹配(代字号、感叹号)的条件语句。命令行:
awk '$1 ~ /n/' testfile
将第一个字段包含字符 n 的全部记录打印至标准输出。此示例中的输出是:
smithern, harry smithhern, anne
^     指定字段或记录的开头。命令行:
awk '$2 ~ /^h/' testfile
将把字符 h 做为第二个字段的第一个字符的全部记录打印至标准输出。此示例中的输出是:
smithern, harry
$     指定字段或记录的末尾。命令行:
awk '$2 ~ /y$/' testfile
将把字符 y 做为第二个字段的最后一个字符的全部记录打印至标准输出。此示例中的输出是:
smawley, andy smithern, harry
. (句号)表示除了在空白末尾的终端换行字符之外的任何一个字符。命令行:
awk '/a..e/' testfile
将具备以两个字符隔开的字符 a 和 e 的全部记录打印至标准输出。此示例中的输出是:
smawley, andy smiley, allen smithhern, anne
*(星号)表示零个或更多的任意字符。命令行:
awk '/a.*e/' testfile
将具备以零个或更多字符隔开的字符 a 和 e 的全部记录打印至标准输出。此示例中的输出是:
smawley, andy smiley, allen smithhern, anne smitters, alexis
\ (反斜杠)转义字符。当位于在扩展正则表达式中具备特殊含义的任何字符以前时,转义字符除去该字符的任何特殊含义。

例如,命令行:
/a\/\//
将与模式 a // 匹配,由于反斜杠否认斜杠做为正则表达式定界符的一般含义。要将反斜杠自己指定为字符,则使用双反斜杠。有关反斜杠及其使用的更多信息,请参阅如下关于转义序列的内容。
与PERs相比,主要是一些结合类型表示符没有了:包括:”\d,\D,\s,\S,\t,\v,\n,\f,\r”其它功能基本同样的。

4、awk 常见调用正则表达式方法
awk语句中:
awk ‘/REG/{action}’
/REG/为正则表达式,能够将$0中,知足条件记录 送入到:action进行处理.
awk正则运算语句(~,~!等同!~)
[@centos5 ~]$ awk 'BEGIN{info="this is a test";if( info ~ /test/){print "ok"}}'
ok
awk内置使用正则表达式函数

awk内置函数,主要分如下3种相似:算数函数、字符串函数、其它通常函数、时间函数
1、算术函数:
如下算术函数执行与 C 语言中名称相同的子例程相同的操做:
atan2( y, x )     返回 y/x 的反正切。
cos( x )     返回 x 的余弦;x 是弧度。
sin( x )     返回 x 的正弦;x 是弧度。
exp( x )     返回 x 幂函数。
log( x )     返回 x 的天然对数。
sqrt( x )     返回 x 平方根。
int( x )     返回 x 的截断至整数的值。
rand( )     返回任意数字 n,其中 0 <= n < 1。
srand( [Expr] )  将 rand 函数的种子值设置为 Expr 参数的值,或若是省略 Expr 参数则使用某天的时间。返回先前的种子值。
举例说明:
[@centos5 ~]$ awk 'BEGIN{OFMT="%.3f";fs=sin(1);fe=exp(10);fl=log(10);fi=int(3.1415);print fs,fe,fl,fi;}'
0.841 22026.466 2.303 3
OFMT 设置输出数据格式是保留3位小数
得到随机数:
[@centos5 ~]$ awk 'BEGIN{srand();fr=int(100*rand());print fr;}'
78
[@centos5 ~]$ awk 'BEGIN{srand();fr=int(100*rand());print fr;}'
31
[@centos5 ~]$ awk 'BEGIN{srand();fr=int(100*rand());print fr;}'
41
2、字符串函数是:
函数 说明
gsub( Ere, Repl, [ In ] )

除了正则表达式全部具体值被替代这点,它和 sub 函数彻底同样地执行,。
sub( Ere, Repl, [ In ] )

用 Repl 参数指定的字符串替换 In 参数指定的字符串中的由 Ere 参数指定的扩展正则表达式的第一个具体值。sub 函数返回替换的数量。出如今 Repl 参数指定的字符串中的 &(和符号)由 In 参数指定的与 Ere 参数的指定的扩展正则表达式匹配的字符串替换。若是未指定 In 参数,缺省值是整个记录($0 记录变量)。
index( String1, String2 )

在由 String1 参数指定的字符串(其中有出现 String2 指定的参数)中,返回位置,从 1 开始编号。若是 String2 参数不在 String1 参数中出现,则返回 0(零)。
length [(String)]

返回 String 参数指定的字符串的长度(字符形式)。若是未给出 String 参数,则返回整个记录的长度($0 记录变量)。
blength [(String)]

返回 String 参数指定的字符串的长度(以字节为单位)。若是未给出 String 参数,则返回整个记录的长度($0 记录变量)。
substr( String, M, [ N ] )

返回具备 N 参数指定的字符数量子串。子串从 String 参数指定的字符串取得,其字符以 M 参数指定的位置开始。M 参数指定为将 String 参数中的第一个字符做为编号 1。若是未指定 N 参数,则子串的长度将是 M 参数指定的位置到 String 参数的末尾 的长度。
match( String, Ere )

在 String 参数指定的字符串(Ere 参数指定的扩展正则表达式出如今其中)中返回位置(字符形式),从 1 开始编号,或若是 Ere 参数不出现,则返回 0(零)。RSTART 特殊变量设置为返回值。RLENGTH特殊变量设置为匹配的字符串的长度,或若是未找到任何匹配,则设置为 -1(负一)。
split( String, A, [Ere] )

将 String 参数指定的参数分割为数组元素 A[1], A[2], . . ., A[n],并返回 n 变量的值。此分隔能够经过 Ere 参数指定的扩展正则表达式进行,或用当前字段分隔符(FS 特殊变量)来进行(若是没有给出 Ere 参数)。除非上下文指明特定的元素还应具备一个数字值,不然 A 数组中的元素用字符串值来建立。
tolower( String )

返回 String 参数指定的字符串,字符串中每一个大写字符将更改成小写。大写和小写的映射由当前语言环境的 LC_CTYPE 范畴定义。
toupper( String )

返回 String 参数指定的字符串,字符串中每一个小写字符将更改成大写。大写和小写的映射由当前语言环境的 LC_CTYPE 范畴定义。
sprintf(Format, Expr, Expr, . . . )

根据 Format 参数指定的 printf 子例程格式字符串来格式化 Expr 参数指定的表达式并返回最后生成的字符串。
Ere均可以是正则表达式
gsub,sub使用
[@centos5 ~]$ awk 'BEGIN{info="this is a test2010test!";gsub(/[0-9]+/,"!",info);print info}'  
this is a test!test!
在 info中查找知足正则表达式,/[0-9]+/ 用””替换,而且替换后的值,赋值给info 未给info值,默认是$0
查找字符串(index使用)
[@centos5 ~]$ awk 'BEGIN{info="this is a test2010test!";print index(info,"test")?"ok":"no found";}'   
ok
未找到,返回0
正则表达式匹配查找(match使用)
[@centos5 ~]$ awk 'BEGIN{info="this is a test2010test!";print match(info,/[0-9]+/)?"ok":"no found";}'

ok
截取字符串(substr使用)
[@centos5 ~]$ awk 'BEGIN{info="this is a test2010test!";print substr(info,4,10);}'
s is a tes
从第 4个 字符开始,截取10个长度字符串
字符串分割(split使用)
[@centos5 ~]$ awk 'BEGIN{info="this is a test";split(info,tA," ");print length(tA);for(k in tA){print k,tA[k];}}'
4
4 test
1 this
2 is
3 a
分割info,动态建立数组tA,这里比较有意思,awk for …in 循环,是一个无序的循环。 并非从数组下标1…n ,所以使用时候须要注意。
格式化字符串输出(sprintf使用)
格式化字符串格式:
其中格式化字符串包括两部份内容: 一部分是正常字符, 这些字符将按原样输出; 另外一部分是格式化规定字符, 以"%"开始, 后跟一个或几个规定字符,用来肯定输出内容格式。
格式符 说明
%d     十进制有符号整数
%u     十进制无符号整数
%f     浮点数
%s     字符串
%c     单个字符
%p     指针的值
%e     指数形式的浮点数
%x     %X 无符号以十六进制表示的整数
%o     无符号以八进制表示的整数
%g     自动选择合适的表示法
[@centos5 ~]$ awk 'BEGIN{n1=124.113;n2=-1.224;n3=1.2345; printf("%.2f,%.2u,%.2g,%X,%o\n",n1,n2,n3,n1,n1);}'
124.11,18446744073709551615,1.2,7C,174
3、通常函数是:
close( Expression )

用同一个带字符串值的 Expression 参数来关闭由 print 或 printf 语句打开的或调用 getline 函数打开的文件或管道。若是文件或管道成功关闭,则返回 0;其它状况下返回非零值。若是打算写一个文件,并稍后在同一个程序中读取文件,则 close 语句是必需的。
system(Command )

执行 Command 参数指定的命令,并返回退出状态。等同于 system 子例程。
Expression | getline [ Variable ]

历来自 Expression 参数指定的命令的输出中经过管道传送的流中读取一个输入记录,并将该记录的值指定给 Variable 参数指定的变量。若是当前未打开将 Expression 参数的值做为其命令名称的流,则建立流。建立的流等同于调用 popen 子例程,此时 Command 参数取 Expression 参数的值且 Mode 参数设置为一个是 r 的值。只要流保留打开且 Expression 参数求得同一个字符串,则对 getline 函数的每次后续调用读取另外一个记录。若是未指定 Variable 参数,则 $0 记录变量和 NF 特殊变量设置为从流读取的记录。
getline [ Variable ] < Expression

从 Expression 参数指定的文件读取输入的下一个记录,并将 Variable 参数指定的变量设置为该记录的值。只要流保留打开且 Expression 参数对同一个字符串求值,则对 getline 函数的每次后续调用读取另外一个记录。若是未指定 Variable 参数,则 $0 记录变量和 NF 特殊变量设置为从流读取的记录。
getline [ Variable ]

将 Variable 参数指定的变量设置为从当前输入文件读取的下一个输入记录。若是未指定 Variable 参数,则 $0 记录变量设置为该记录的值,还将设置 NF、NR 和 FNR 特殊变量。
打开外部文件(close用法)
[@centos5 ~]$ awk 'BEGIN{while("cat /etc/passwd"|getline){print $0;};close("/etc/passwd");}'
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
逐行读取外部文件(getline使用方法)
[@centos5 ~]$ awk 'BEGIN{while(getline < "/etc/passwd"){print $0;};close("/etc/passwd");}'
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[@centos5 ~]$ awk 'BEGIN{print "Enter your name:";getline name;print name;}'
Enter your name:
chengmo
chengmo
调用外部应用程序(system使用方法)
[@centos5 ~]$ awk 'BEGIN{b=system("ls -al");print b;}'
total 42092
drwxr-xr-x 14 chengmo chengmo     4096 09-30 17:47 .
drwxr-xr-x 95 root   root       4096 10-08 14:01 ..
b返回值,是执行结果。
4、时间函数
函数名 说明
mktime( YYYY MM DD HH MM SS[ DST])     生成时间格式
strftime([format [, timestamp]])     格式化时间输出,将时间戳转为时间字符串
具体格式,见下表.
systime()     获得时间戳,返回从1970年1月1日开始到当前时间(不计闰年)的整秒数
建立指定时间(mktime使用)
[@centos5 ~]$ awk 'BEGIN{tstamp=mktime("2001 01 01 12 12 12");print strftime("%c",tstamp);}'
2001年01月01日 星期一 12时12分12秒
[@centos5 ~]$ awk 'BEGIN{tstamp1=mktime("2001 01 01 12 12 12");tstamp2=mktime("2001 02 01 0 0 0");print tstamp2-tstamp1;}'
2634468
求2个时间段中间时间差,介绍了strftime使用方法
[@centos5 ~]$ awk 'BEGIN{tstamp1=mktime("2001 01 01 12 12 12");tstamp2=systime();print tstamp2-tstamp1;}'
308201392
strftime日期和时间格式说明符
格式 描述
%a     星期几的缩写(Sun)
%A     星期几的完整写法(Sunday)
%b     月名的缩写(Oct)
%B     月名的完整写法(October)
%c     本地日期和时间
%d     十进制日期
%D     日期 08/20/99
%e     日期,若是只有一位会补上一个空格
%H     用十进制表示24小时格式的小时
%I     用十进制表示12小时格式的小时
%j     从1月1日起一年中的第几天
%m     十进制表示的月份
%M     十进制表示的分钟
%p     12小时表示法(AM/PM)
%S     十进制表示的秒
%U     十进制表示的一年中的第几个星期(星期天做为一个星期的开始)
%w     十进制表示的星期几(星期天是0)
%W     十进制表示的一年中的第几个星期(星期一做为一个星期的开始)
%x     从新设置本地日期(08/20/99)
%X     从新设置本地时间(12:00:00)
%y     两位数字表示的年(99)
%Y     当前月份
%Z     时区(PDT)
%%     百分号(%)

SED

sed命令的调用:

在命令行键入命令;将sed命令插入脚本文件,而后调用sed;将sed命令插入脚本文件,并使sed脚本可执行

sed [option] sed命令 输入文件 在命令行使用sed命令,实际命令要加单引号

sed [option] -f sed脚本文件 输入文件 使用sed脚本文件

sed 脚本文件 [option] 输入文件 第一行具备sed命令解释器的sed脚本文件

option以下:

-n 不打印; sed不写编辑行到标准输出,缺省为打印全部行(编辑和未编辑),p命令能够用来打印编辑行

-c 下一命令是编辑命令,使用多项编辑时加入此选项

-f 若是正在调用sed脚本文件,使用此选项,此选项通知sed一个脚本文件支持所用的sed命令,如

sed -f myscript.sed input_file 这里myscript.sed即为支持sed命令的文件

使用重定向文件便可保存sed的输出

使用sed在文本中定位文本的方式:

x x为一行号,好比1

x,y 表示行号范围从x到y,如2,5表示从第2行到第5行

/pattern/ 查询包含模式的行,如/disk/或/[a-z]/

/pattern/pattern/ 查询包含两个模式的行,如/disk/disks/

/pattern/,x 在给定行号上查询包含模式的行,如/disk/,3

x,/pattern/ 经过行号和模式查询匹配行,如 3,/disk/

x,y! 查询不包含指定行号x和y的行

基本sed编辑命令:

p 打印匹配行 c\ 用新文本替换定位文本

= 显示文件行号 s 使用替换模式替换相应模式

a\ 在定位行号后附加新文本信息 r 从另外一个文本中读文本

i\ 在定位行号后插入新文本信息 w 写文本到一个文件

d 删除定位行 q 第一个模式匹配完成后退出或当即退出

l 显示与八进制ASCII代码等价的控制字符 y 传送字符

n 从另外一个文本中读文本下一行,并附加在下一行 {} 在定位行执行的命令组

g 将模式2粘贴到/pattern n/

基本sed编程举例:

使用p(rint)显示行: sed -n '2p' temp.txt 只显示第2行,使用选项n

打印范围: sed -n '1,3p' temp.txt 打印第1行到第3行

打印模式: sed -n '/movie/'p temp.txt 打印含movie的行

使用模式和行号查询: sed -n '3,/movie/'p temp.txt 只在第3行查找movie并打印

显示整个文件: sed -n '1,$'p temp.txt $为最后一行

任意字符: sed -n '/.*ing/'p temp.txt 注意是.*ing,而不是*ing

打印行号: sed -e '/music/=' temp.txt

附加文本:(建立sed脚本文件)chmod u+x script.sed,运行时./script.sed temp.txt

#!/bin/sed -f

/name1/ a\ #a\表示此处换行添加文本

HERE ADD NEW LINE. #添加的文本内容

插入文本: /name1/ a\ 改为 4 i\ 4表示行号,i插入

修改文本: /name1/ a\ 改为 /name1/ c\ 将修改整行,c修改

删除文本: sed '1d' temp.txt 或者 sed '1,4d' temp.txt

替换文本: sed 's/source/OKSTR/' temp.txt 将source替换成OKSTR

sed 's/\$//g' temp.txt 将文本中全部的$符号所有删除

sed 's/source/OKSTR/w temp2.txt' temp.txt 将替换后的记录写入文件temp2.txt

替换修改字符串: sed 's/source/"ADD BEFORE" &/p' temp.txt

结果将在source字符串前面加上"ADD BEFORE",这里的&表示找到的source字符并保存

sed结果写入到文件: sed '1,2 w temp2.txt' temp.txt

sed '/name/ w temp2.txt' temp.txt

从文件中读文本: sed '/name/r temp2.txt' temp.txt

在每列最后加文本: sed 's/[0-9]*/& Pass/g' temp.txt

从shell向sed传值: echo $NAME | sed "s/go/$REP/g" 注意须要使用双引号

快速一行命令:

's/\.$//g' 删除以句点结尾行

'-e /abcd/d' 删除包含abcd的行

's/[][][]*/[]/g' 删除一个以上空格,用一个空格代替

's/^[][]*//g' 删除行首空格

's/\.[][]*/[]/g' 删除句号后跟两个或更多的空格,用一个空格代替

'/^$/d' 删除空行

's/^.//g' 删除第一个字符,区别 's/\.//g'删除全部的句点

's/COL/(...\)//g' 删除紧跟COL的后三个字母

's/^\///g' 删除路径中第一个\

///////////////////////////////////////////////////////////////////////

一、使用句点匹配单字符

句点“.”能够匹配任意单字符。“.”能够匹配字符串头,也能够是中间任意字符。假定正在过滤一个文本文件,对于一个有1 0个字符的脚本集,要求前4个字符以后为X C,匹配操做以下:. . . .X C. . . .

二、在行首以^匹配字符串或字符序列

^只容许在一行的开始匹配字符或单词。在行首第4个字符为1,匹配操做表示为:^ . . . 1

三、在行尾以$匹配字符串或字符

能够说$与^正相反,它在行尾匹配字符串或字符, $符号放在匹配单词后。若是在行尾匹配单词j e t 0 1,操做以下:j e t 0 1 $ 若是只返回包含一个字符的行,操做以下:^ . $

四、使用*匹配字符串中的单字符或其重复序列

使用此特殊字符匹配任意字符或字符串的重复屡次表达式。

五、使用\屏蔽一个特殊字符的含义

有时须要查找一些字符或字符串,而它们包含了系统指定为特殊字符的一个字符。若是要在正则表达式中匹配以* . p a s结尾的全部文件,可作以下操做:\ * \ . p a s

六、使用[]匹配一个范围或集合

使用[ ]匹配特定字符串或字符串集,能够用逗号将括弧内要匹配的不一样字符串分开,但并不强制要求这样作(一些系统提倡在复杂的表达式中使用逗号),这样作能够增 加模式的可读性。使用“ -”表示一个字符串范围,代表字符串范围从“ -”左边字符开始,到“ -”右边字符结束。假定要匹配任意一个数字,可使用:[ 0 1 2 3 4 5 6 7 8 9 ] 要匹配任意字母,则使用:[ A - Z a - z ]代表从A - Z、a - z的字母范围。

七、使用\{\}匹配模式结果出现的次数

使用*可匹配全部匹配结果任意次,但若是只要指定次数,就应使用\ { \ },此模式有三种形式,即:

pattern\{n\} 匹配模式出现n次。

pattern\{n,\} 匹配模式出现最少n次。

pattern\{n,m} 匹配模式出现n到m次之间,n , m为0 - 2 5 5中任意整数。

匹配字母A出现两次,并以B结尾,操做以下:

A \ { 2 \ } B 匹配值为A A B

匹配A至少4次,使用:

A \ { 4 , \ } B

基本语法

在对正则表达式的功能和做用有了初步的了解以后,咱们就来具体看一下正则表达式的语法格式。

正则表达式的形式通常以下:

/love/

其中位于“/”定界符之间的部分就是将要在目标对象中进行匹配的模式。用户只要把但愿查找匹配对象的模式内容放入“/”定界符之间便可。为了可以使用户 更加灵活的定制模式内容,正则表达式提供了专门的“元字符”。所谓元字符就是指那些在正则表达式中具备特殊意义的专用字符,能够用来规定其前导字符(即位 于元字符前面的字符)在目标对象中的出现模式。

较为经常使用的元字符包括: “+”, “*”,以及 “?”。其中,“+”元字符规定其前导字符必须在目标对象中连续出现一次或屡次,“*”元字符规定其前导字符必须在目标对象中出现零次或连续屡次,而“?”元字符规定其前导对象必须在目标对象中连续出现零次或一次。

下面,就让咱们来看一下正则表达式元字符的具体应用。

/fo+/

由于上述正则表达式中包含“+”元字符,表示能够与目标对象中的 “fool”, “fo”, 或者 “football”等在字母f后面连续出现一个或多个字母o的字符串相匹配。

/eg*/

由于上述正则表达式中包含“*”元字符,表示能够与目标对象中的 “easy”, “ego”, 或者 “egg”等在字母e后面连续出现零个或多个字母g的字符串相匹配。

/Wil?/

由于上述正则表达式中包含“?”元字符,表示能够与目标对象中的 “Win”, 或者 “Wilson”,等在字母i后面连续出现零个或一个字母l的字符串相匹配。

除了元字符以外,用户还能够精确指定模式在匹配对象中出现的频率。例如,

/jim{2,6}/

上述正则表达式规定字符m能够在匹配对象中连续出现2-6次,所以,上述正则表达式能够同jimmy或jimmmmmy等字符串相匹配。

其它几个重要的元字符的使用方式。

\s: 用于匹配单个空格符,包括tab键和换行符;

\S: 用于匹配除单个空格符以外的全部字符;

\d: 用于匹配从0到9的数字;

\w: 用于匹配字母,数字或下划线字符;

\W: 用于匹配全部与\w不匹配的字符;

. : 用于匹配除换行符以外的全部字符。

(说明:能够把\s和\S以及\w和\W看做互为逆运算)

下面经过实例看一下如何在正则表达式中使用上述元字符。

/\s+/

上述正则表达式能够用于匹配目标对象中的一个或多个空格字符。

/\d000/

若是咱们手中有一份复杂的财务报表,那么咱们能够经过上述正则表达式垂手可得的查找到全部总额达千元的款项。

除了上述元字符以外,正则表达式中还具备另一种较为独特的专用字符,即定位符。

定位符用于规定匹配模式在目标对象中的出现位置。

较为经常使用的定位符包括: “^”, “$”, “\b” 以及 “\B”。其中,“^”定位符规定匹配模式必须出如今目标字符串的开头,“$”定位符规定匹配模式必须出如今目标对象的结尾,\b定位符规定匹配模式必须 出如今目标字符串的开头或结尾的两个边界之一,而“\B”定位符则规定匹配对象必须位于目标字符串的开头和结尾两个边界以内,即匹配对象既不能做为目标字 符串的开头,也不能做为目标字符串的结尾。一样,咱们也能够把“^”和“$”以及“\b”和“\B”看做是互为逆运算的两组定位符。举例来讲:

/^hell/

由于上述正则表达式中包含“^”定位符,因此能够与目标对象中以 “hell”, “hello”或 “hellhound”开头的字符串相匹配。

/ar$/

由于上述正则表达式中包含“$”定位符,因此能够与目标对象中以 “car”, “bar”或 “ar” 结尾的字符串相匹配。

/\bbom/

由于上述正则表达式模式以“\b”定位符开头,因此能够与目标对象中以 “bomb”, 或 “bom”开头的字符串相匹配。

/man\b/

由于上述正则表达式模式以“\b”定位符结尾,因此能够与目标对象中以 “human”, “woman”或 “man”结尾的字符串相匹配。

为了可以方便用户更加灵活的设定匹配模式,正则表达式容许使用者在匹配模式中指定某一个范围而不局限于具体的字符。例如:

/[A-Z]/

上述正则表达式将会与从A到Z范围内任何一个大写字母相匹配。

/[a-z]/

上述正则表达式将会与从a到z范围内任何一个小写字母相匹配。

/[0-9]/

上述正则表达式将会与从0到9范围内任何一个数字相匹配。

/([a-z][A-Z][0-9])+/

上述正则表达式将会与任何由字母和数字组成的字符串,如 “aB0” 等相匹配。这里须要提醒用户注意的一点就是能够在正则表达式中使用 “()” 把字符串组合在一块儿。“()”符号包含的内容必须同时出如今目标对象中。所以,上述正则表达式将没法与诸如 “abc”等的字符串匹配,由于“abc”中的最后一个字符为字母而非数字。

若是但愿在正则表达式中实现相似编程逻辑中的“或”运算,在多个不一样的模式中任选一个进行匹配的话,可使用管道符 “|”。例如:

/to|too|2/

上述正则表达式将会与目标对象中的 “to”, “too”, 或 “2” 相匹配。

正则表达式中还有一个较为经常使用的运算符,即否认符 “[^]”。与咱们前文所介绍的定位符 “^” 不一样,否认符 “[^]”规定目标对象中不能存在模式中所规定的字符串。例如:

/[^A-C]/

上述字符串将会与目标对象中除A,B,和C以外的任何字符相匹配。通常来讲,当“^”出如今 “[]”内时就被视作否认运算符;而当“^”位于“[]”以外,或没有“[]”时,则应当被视作定位符。

当用户须要在正则表达式的模式中加入元字符,并查找其匹配对象时,可使用转义符“\”。例如:

/Th\*/

上述正则表达式将会与目标对象中的“Th*”而非“The”等相匹配。

sed 字符类

[:alnum:] 字母数字 [a-z A-Z 0-9]

[:alpha:] 字 母 [a-z A-Z]

[:blank:] 空格或制表键

[:cntrl:] 任何控制字符

[:digit:] 数字 [0-9]

[:graph:] 任何可视字符(无空格)

[:lower:] 小写 [a-z]

[:print:] 非控制字符

[:punct:] 标点字符

[:space:] 空格

[:upper:] 大写 [A-Z]

[:xdigit:] 十六进制数字 [0-9 a-f A-F]

相关文章
相关标签/搜索