正则表达式的原理
基本正则表达式
行首定位符 ^
“^” :用来匹配行首的字符,表示行首的字符是 “ ^ ” 后面的那个字符。
[linux@localhost express]$ more exp_1.sh
#! bin/bash
#首行定位符
#列出 /etc 目录中的以字母po开头的文件
str=`ls /etc | grep "^po"`
echo "$str"
[linux@localhost express]$ sh exp_1.sh
polkit-1
popt.d
postfix
[linux@localhost express]$
行尾定位符 $
“$”:用来定位文本行的末尾,与 行首定位符 的作用恰恰相反。
[linux@localhost express]$ cat exp_3.sh
#! bin/bash
#行尾定位符
#列出 /etc 目录中以 conf 结尾的文件名
str=`ls /etc | grep "conf$"`
echo "$str"
[linux@localhost etc]$ sh exp_3.sh
asound.conf
chrony.conf
dracut.conf
e2fsck.conf
GeoIP.conf
host.conf
kdump.conf
krb5.conf
ld.so.conf
libaudit.conf
libuser.conf
locale.conf
logrotate.conf
man_db.conf
mke2fs.conf
nsswitch.conf
resolv.conf
rsyslog.conf
sestatus.conf
sudo.conf
sudo-ldap.conf
sysctl.conf
vconsole.conf
yum.conf
[linux@localhost etc]$
单个字符匹配 .
“.”:可以用来匹配任意单个字符,包括空格,但不包括换行符 “/n”。
当你使用 “.” 符号后,就意味着该位置一定有一个字符,无论他是什么字符。
[linux@localhost express]$ cat exp_2.sh
#! bin/bash
#单个字符匹配 "."
#列出所有的包含字符串 "shadow" 的文件名
str=`ls /etc | grep "shadow"`
echo "$str"
echo "===_===_===_==="
#列出包含字符串 shadow ,且比其后面多一位不确定字符的 文件名 - shadow?`
str=`ls /etc | grep "shadow."`
echo "$str"
[linux@localhost express]$ sh exp_2.sh
gshadow
gshadow-
shadow
shadow-
===_===_===_===
gshadow-
shadow-
[linux@localhost express]$
限定符*
限定符本身不代表任何字符,他是用来指定其前面的一个字符必须重复多少次才能满足匹配。
“ * ”:表示匹配其前导字符的任意次数,包括 0 次
[linux@localhost express]$ cat exp_4.sh
#! bin/bash
#限定符 "*"
#筛选出以字符串 s 开头,紧跟着的一个字符 也是 s ,其次后面任意个字符 s 的文件名
str=`ls /etc | grep "^sss*"`
echo "$str"
echo "^ss 的结果,这里也是一样的,任意个 s ,可以是0个s"
echo "`ls /etc | grep "^ss"`"
[linux@localhost express]$ sh exp_4.sh
ssh
ssl
^ss 的结果,这里也是一样的,任意个 s ,可以是0个s
ssh
ssl
[linux@localhost express]$
这要注意,0次也算。
字符集匹配 []
方括号 “ [] ”,用来指定一个字符集,,语法:
[sky]
其中s、k 和 y 表示任意的单个字符。
只要某个字符串在方括号所在的位置上出现了方括号中的任意一个字符,就满足匹配
另外,对于连续的数字或字母,可以用连字符 “-”来表示一个范围,列如:[1-9]、[a-f] 等
[linux@localhost express]$ cat exp_5.sh
#! bin/bash
#字符集匹配"[]"
#筛选所有以字符串r开头,并且紧跟着一个字符c的文本行
str=`ls /etc | grep "^rc"`
echo "$str"
echo "==========="
#筛选所有以字符r开头,紧跟着一个c,下面一个字符为0-9的单个数字的文本行
str=`ls /etc | grep "^rc[0-9]"`
echo "$str"
[linux@localhost express]$ sh exp_5.sh
rc0.d
rc1.d
rc2.d
rc3.d
rc4.d
rc5.d
rc6.d
rc.d
rc.local
===========
rc0.d
rc1.d
rc2.d
rc3.d
rc4.d
rc5.d
rc6.d
[linux@localhost express]$
字符集不匹配 [^]
前面已经介绍过 行首定位符 “^” 和 字符集匹配符 “[]”。但是如果将这两个符号结合起来,则意义就会发生变化。
符号 “[^]” 表示不匹配其中列出的任意字符,,语法:
[^sky]
其中 s、k 和 y 表示 任意字符,用法和 “[]” 神似,不再举例说明。