liunx中怎么正则表达式匹配字符串想用的字符串

bash字符串匹配的用法 - LinuxSir.Org
我的图书馆
bash字符串匹配的用法 - LinuxSir.Org
标题: bash字符串匹配的用法
bash字符串匹配的用法 04/12/2007
==============
把我今天学到的一点东西记下来。不对的地方请大家指正。
Bash的字符串匹配共有6种形式:
1. ${variable#pattern}
如果pattern匹配variable的开始部分,从variable的开始处删除字符直到第一个匹配的位置,包括匹配部分,返回剩余部分。
2. ${variable##pattern}
如果pattern匹配variable的开始部分,从variable的开始处删除字符直到最后一个匹配的位置,包括匹配部分,返回剩余部分。
3. ${variable%pattern}
如果pattern匹配variable的结尾部分,从variable的结尾处删除字符直到第一个匹配的位置,包括匹配部分,返回剩余部分。
4. ${variable%%pattern}
如果pattern匹配variable的结尾部分,从variable的结尾处删除字符直到最后一个匹配的位置,包括匹配部分,返回剩余部分。
5. ${variable/pattern/string}
6. ${variable//pattern/string}
最后这两种用法用于匹配替换。因为我没用到,先不说了。(busybox 1.0.1 不支持最后这两种语法。)
str=t/onepath/anotherpath
echo ${str#*/}
输出://onepath/anotherpath
echo ${str##*/}
输出:anotherpath
echo ${str%/*}
输出:t/onepath
echo ${str%%/*}
输出:tftp:
--------------------
下面说一说具体怎么用。
假设在某个系统中没有sed和awk, 只有grep,tr和cut。
如果要取得网卡的mac地址,可以:
mac_addr=$(ifconfig eth0 | grep HWaddr | cut -d' ' -f11 | tr -d : )
echo $mac_addr
后面再说为什么我要把冒号去掉。这种方式在cut时要经过实验才知道我们要的是第11个field。现在换另一种方式:
mac_addr=$(ifconfig eth0 | grep HWaddr | tr -d ' :')
echo $mac_addr
输出:eth0LinkencapEthernetHWaddrBF
mac_addr=${mac_addr#*HWaddr}
echo $mac_addr
现在要求写一个程序,接受命令行给定一个网址去下载一个文件,要求根据网址的协议的不同,采用不同的程序下载。如果给定的网址以.xml结尾,则认为要下载的文件已经在给定的网址中指定,否则要下载的文件名为本机的mac地址加.xml扩展名,不包括mac中的冒号。
例如给定 tftp://host/file.xml,则要用tftp命令下载host上的file.xml文件。
如果给定 ,则要用wget命令下载host/path上的BF.xml文件。
先取网址的协议,采用从右向左最大匹配"://":
proto=${url%%://*}
再判断文件名是否已经给定, 采用从左向右最大匹配".xml":
[ -z "${url##*.xml}" ] || url=$url/$mac_addr.xml
如果 $proto = "http" 或者 "ftp"
wget $url -O local_file
如果 $proto = "tftp",这个有点麻烦,因为tftp的用法是:
tftp -g -r remote_file -l local_file host
所以还要把remote_file和host从url中提取出来。
先把url中的tftp://去掉:
tmp=${url#*://}
再从右向左最大匹配"/"得到host:
host=${tmp%%/*}
再从左向右最小匹配"/"得到路径和文件名:
remote_file=${tmp#*/}
剩下的事情就简单了。。。
TA的最新馆藏[转]&[转]&[转]&[转]&
喜欢该文的人也喜欢看书、学习、写代码
在使用grep、awk和sed命令时,需要使用正则表达式。比如我通过grep找代码编译结果中是否有错误。或者是否有我代码的错误。这里说下正则表达式基本的应用: o 匹配行首与行尾。o 匹配数据集。o 只匹配字母和数字。o 匹配一定范围内的字符串集。 &
^ 只匹配行首
$ 只匹配行尾
* 一个单字符后紧跟*,匹配0个或多个此单字符
[] 匹配[]内字符,可以是一个单字符,也可以是字符序列。可以使用 - 表示[]内字符序列范围,如用[1-5]代替[12345]
\ 用来屏蔽一个元字符的特殊含义。因为有时在shell中一些元字符有特殊含义。\可以使其失去应有含义。
. 匹配任意单字符
pattern\{n\} 用来匹配前面pattern出现次数。n为次数
pattern\{n,\} 含义同上,但次数最少为n
patter\{n,m\} 含义同上,但pattern出现次数在n与m之间 &
使用句点匹配单字符句点“.”可以匹配任意单字符。例如,如果要匹配一个字符串,以be g开头,中间夹一个任意字符,那么可以表示为be g . n,“.”可以匹配字符串头,也可以是中间任意字符。在ls-l命令中,可以匹配一定权限:.. . x . . x . . x此格式匹配用户本身,用户组及其他组成员的执行权限。~$ ls -l |grep ...x..x..xdrwxrwxrwx 1 h Domain U 0 一月 19 08:38 bindrwxrwxrwx 1 h Domain U 0 二月 7 08:06 emacsdrwxrwxrwx 1 h Domain U 0 一月 19 08:38 etcdrwxrwxrwx 1 h Domain U 0 一月 19 08:38 infodrwxrwxrwx 1 h Domain U 0 一月 19 08:38 leimdrwxrwxrwx 1 h Domain U 0 二月 7 09:05 lispdrwxrwxrwx 1 h Domain U 0 二月 7 08:07 site-lisp~$ 在行首以^匹配字符串或字符序列^只允许在一行的开始匹配字符或单词。例如,使用ls-l命令,并匹配目录。之所以可以这样做是因为ls-l命令结果每行第一个字符是d,即代表一个目录。~$ ls -l |grep ^ddrwxrwxrwx 1 h Domain U 0 一月 19 08:38 bindrwxrwxrwx 1 h Domain U 0 二月 7 08:06 emacsdrwxrwxrwx 1 h Domain U 0 一月 19 08:38 etcdrwxrwxrwx 1 h Domain U 0 一月 19 08:38 infodrwxrwxrwx 1 h Domain U 0 一月 19 08:38 leimdrwxrwxrwx 1 h Domain U 0 二月 7 09:05 lispdrwxrwxrwx 1 h Domain U 0 二月 7 08:07 site-lisp 在行尾以$匹配字符串或字符可以说$与^正相反,它在行尾匹配字符串或字符,$符号放在匹配单词后。假定要匹配以单词lisp结尾的所有行,操作为:~$ ls |grep sp$lispsite-lisp~$ 使用*匹配字符串中的单字符或其重复序列使用此特殊字符匹配任意字符或字符串的重复多次表达式。例如:找e*m(以e开头m结束的字符串)~$ ls | grep e*memacsleim~$ 使用\屏蔽一个特殊字符的含义有时需要查找一些字符或字符串,而它们包含了系统指定为特殊字符的一个字符。什么是特殊字符?一般意义上讲,下列字符可以认为是特殊字符:$ . ' " * [ ] ^ | { } \ + ?例如:找以.el后缀的文件~/lisp$ ls | grep \.el$abbrev.elabbrevlist.eladd-log.elalign.elallout.elansi-color.elapropos.elarc-mode.elarray.elautoarg.elautoinsert.elautorevert.elavoid.elbattery.elbindings.elbookmark.elbs.elbuff-menu.elbutton.elcalculator.elcase-table.el 使用[]匹配一个范围或集合使用[]匹配特定字符串或字符串集,可以用逗号将括弧内要匹配的不同字符串分开,但并不强制要求这样做(一些系统提倡在复杂的表达式中使用逗号),这样做可以增加模式的可读性。使用“-”表示一个字符串范围,表明字符串范围从“-”左边字符开始,到“-”右边字符结束。如果熟知一个字符串匹配操作,应经常使用[]模式。假定要匹配任意一个数字,可以使用:[]然而,通过使用“-”符号可以简化操作:[0-9]或任意小写字母[a-z]要匹配任意字母,则使用:[A-Za-z]表明从A-Z、a-z的字母范围。如要匹配任意字母或数字,模式如下:[A-Za-z0-9]注意^符号的使用,当直接用在第一个括号里,意指否定或不匹配括号里内容。[^a-zA-Z]匹配任一非字母型字符,而[^0-9]匹配任一非数字型字符。通过最后一个例子,应可猜知除了使用^,还有一些方法用来搜索任意一个特殊字符。 使用\{\}匹配模式结果出现的次数使用*可匹配所有匹配结果任意次,但如果只要指定次数,就应使用\{ \ },此模式有三种形式,即:pattern\{n\}匹配模式出现n次。pattern\{n,\}匹配模式出现最少n次。pattern\{n,m}匹配模式出现n到m次之间,n , m为0 - 2 5 5中任意整数。例如格式如下:前4个字符是数字,接下来是xx,最后4个也是数字,操作如下:[0-9]\{4\}XX[0-9]\{4\}具体含义如下:1)匹配数字出现4次。2)后跟代码xx。3)最后是数字出现4次。
阅读(...) 评论()用户名:wubinary
文章数:26
评论数:11
访问量:28730
注册日期:
阅读量:1297
阅读量:3317
阅读量:450501
阅读量:1135074
51CTO推荐博文
  在Linux中通常可以使用 grep 和 egrep 命令在文件中筛选字符,查找到你想要的结果。这两个命令的强大之处是可以结合正则表达式使用。那么什么是正则表达式?正则表达式是一组使用单个字符串来描述、匹配一系列符合某个句法规则的字符串,正则表达式通常分为基本正则表达式和扩展正则表达式。grep命令可以使用基本的正则表达式作筛选,加上一个参数 -E 则可以使用扩展的正则表达式。而egrep则是使用扩展的正则表达式,用法和 grep -E 是一样的。那么现在就来说说正则表达式吧。一、正则表达式正则表达式是一类用来匹配字符串的模式,而这种模式最基本的单位是元字符。元字符是在正则表达式中具有某种特殊用途的字符,例如:.、*、?、+、()、[]等等。元字符可以代表其指定范围内的一种模式,各种功能各异的元字符通过正则表达式的规则组合在一起,可以代表几乎任何你所能想到的字符串。元字符按功能分可以分为:字符匹配元字符、次数匹配元字符、位置描定元字符、分组匹配元字符、后向引用元字符等。不过个人认为在正则表达式中特别需要注意的一点是:1、要分清当前元字符匹配的是单个字符还是一串字符串;2、要知道当前的元字符是修饰当前匹配的字符中的哪一块,前面、后面、括号里、括号内,这一点有点类似于汉语中的主谓宾。 & 在Linux中grep和egrep分别使用了基本的的正则表达式和扩展的正则表达式,区别是egrep的使用的扩展正则表多了一个+ (匹配其前面的字符至少1次) 和 | (或)以及不用加\转义。二、grep和egrep的使用1、grep和egrep支持的正则表达式的元字符有以下这些(1)、针对单个字符的匹配: &. : 匹配任意单个字符 &[]: 匹配指定范围内的任意单个字符 & & &针对[]又有几个扩展的元字符 & & &[0-9]&=&[[:digit:]]:表示匹配所有数字 & & &[a-z]&=&[[:lower:]]:表示匹配所有小写字母 & & &[A-Z]&=&[[:upper:]]:表示匹配所有大写字母 & & & & & & &[[:alpha:]]:表示匹配所有字母 & & & & & & &[[:alnum:]]:表示匹配所有数字和字符 & & & & & & &[[:space:]]:表示匹配所有空白字符 & & & & & & &[[:punct:]]:表示匹配所有标点符号 [^]: 匹配指定范围外的任意单个字符(2)、字符重复匹配: & & * : 匹配星号前面的字符任意次,*符号前面接字符,表示匹配前面那个字符零次或多次,只能匹配前面紧挨着的单个字符或分组字符 & &\? : 匹配问号前面的字符0次或1次+: 匹配其前面的字符至少1次(此为egrep或 grep -E 专有) &\{m\}: 匹配前面的字符m次\{m,n\}: 匹配前面的字符m至n次 \{m,\}: 匹配前面的字符至少m次,m次以上\{0,n\}: 匹配前面的字符至多n次,0不能省略说明:以上元字符当egrep使用时通通不用加反斜线(\)。(3)、字符位置锚字匹配: & & ^: 用于锚定字符串的行首,匹配的字符必须是一行的第一个 & & $: 用于锚定字符串的行尾,匹配的字符必须是一行的最后一个 & &\&: 用于锚定词首, 用法和\b加上字符是一样的,放在字符前面 & &\&: 用于锚定词尾, 用法和\b加上字符是一样的,放在字符后面(4)、分组匹配: & \(\):括号内的字符为一组,作为一个整体来匹配 & & |: 或者(此为egrep或 grep -E 专有)说明:小括号当egrep使用时不用加反斜线(\)。(5)、后向引用: \1: 这个必须和分组结合使用才能发挥作用,代表着匹配前面从左往右数第一个括号内匹配到的结果再来一遍,注意是结果再来遍,表示前后要一模一样,数字代表着前面括号的编号,类似的可以有\2、\3...。2、元字符总结:基本正则表达式(grep)基本正则表达式(egrep)说明字符匹配元字符..匹配任意单个字符[][]匹配指定范围内的任意单个字符[^][^]匹配指定范围外的任意单个字符字符重复匹配**匹配星号前面的字符任意次\??匹配问号前面的字符0次或1次+匹配其前面的字符至少1次\{m\}{m}匹配前面的字符m次\{m,n\}{m,n}匹配前面的字符m至n次\{0,n\}{0,n}匹配前面的字符至多n次字符位置锚字匹配^^用于锚定字符串的行首$$用于锚定字符串的行尾\& 或 \b\& 或 \b用于锚定词首\& 或 \b\& 或 \b用于锚定词尾分组匹配\(\)()括号内的字符为一组后向引用\1\1表示前面从左往右数第1个括号内匹配到的结果再来一遍\2\2表示前面从左往右数第2个括号内匹配到的结果再来一遍......3、用法使用前可以先给grep定义一下别名,grep有一个参数:--color=auto,这个参数加上后可以把匹配到的结果按红色显示。。alias grep='grep --color=auto'grep常用参数:-v: 取反匹配,显示不能被模式匹配到的行
-o: 显示被模式匹配到的字串,而非整行
-i: 忽略字符大小写
-E: 支持扩展的正则表达式,和egrep一样
-A: 显示被模式匹配到的行以及下面一行
-B: 显示被模式匹配到的行以及上面一行
-C: 显示被模式匹配到的行以及上下一行(1)、匹配以Lin开头,以x结尾的字符 说明:.匹配任意单个字符(2)、匹配单词meritocratic和and之间的任意字符说明:\&和\&可以放在单词前后定位一个单词,.和*结合代表匹配任意字符任意次(3)、匹配不是以点号结尾的行说明:.是元字符所以放在中括号中要使用反斜线(\)转义(4)、匹配有四位数字的行说明:[0-9]和[[:digit:]]是一个意思表示匹配任意数字,\{4\}这个表示重复前面模式4次,所以这次有两种写法。(5)、匹配一行以带有大写字母O且O必须在单词中间的单词开头的行说明:^代表定位到行首,\&[[:alpha:]]\{1,\}表示匹配任意字母至少一次(6)、匹配带有一个以数字结尾的单词的行说明:首先锚定单词的首和尾,然后匹配数字前面的字母至少一次,匹配单词后面的数字一次。(7)、匹配以标点符号结尾的行说明:[[:punct:]]$ 这么写也行,参数-v作反向匹配。(8)、匹配一个以数字结尾的单词说明:参数-o可以把匹配到的结果显示,而不是整行。(9)、匹配一个带有以hello开头并且以hello结尾的单词的行说明:grep加参数-E可以使用扩展正则表达式,所以模式里的括号不用加反斜线了,把hello字符分组 & & &后面使用\1引用前面匹配到的结果。(10)、|(或)的用法说明:此处使用的是egrep命令,当使用|时,放在括号里和放括号外是两回事,当不加括号时就如上 & & &面一样,匹配的是以小写sound开头或者带有Sound单词的行。如果要精确匹配以sound或Sound & & &开头的单词时,就必须这样写了"^(sound|Sound)",如下图:(11)、最后说一个匹配IP地址的正则表达式说明:IP地址的格式通常是1.0.0.1-223.255.255.254,我们可以用点号把它分成四段来写,于是就可以这 & & &样写第一段[0-9]匹配数字,但是每段都有一位、两位、三位数并且大于二百的数字最大是223,于 & & &是改进一下,可以这样写[1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-2][0-3]为了让 | 自动筛选前后的结果, & & &我们得给它加上括号使它成为一组,因为之前说过,加括号和不加括号是两个不同的模式,为了让 & & &它锚定字数字可以得到\&([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-2][0-3])\&,这是第一段,然后可以 & & &匹配第二段的数字,第二段最大是255,于是\&([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\&三和二是一样的,我们可以直接拿来用(\&([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\&\.){2}第四段也是差不多的,和二、三段类似,\&([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\& & & &把第一段后面的点号加上,和二三段组合, & & &\&([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-2][0-3])\&\.(\&([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\&\.){2} & & &最后把四段全部结合在一起,于是我们就有了最终的结果:\&([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-2][0-3])\&\.(\&([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\&\.){2}\&([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\&结语:学习是一个熟能生巧的过程,最好的办法就是学以致用。本人刚学Linux,新手一个,以上是本人的学习 & & &体会,不足之处还望各位大侠批评指正。
了这篇文章
类别:┆阅读(0)┆评论(0)您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
Linux下的字符串匹配.ppt 57页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
需要金币:100 &&
Linux下的字符串匹配.ppt
你可能关注的文档:
··········
··········
Linux下的字符串匹配
HPC-NQS)张磊 何时需要进行字符串匹配? 文本检索
Linux字符串匹配的手段 自已写算法
使用正则表达式
使用特定的工具
自已写算法 最简单的匹配算法 int index(char *s, char *t,int pos) {
*返回子串t在主串s中第pos个字符之后的位置
* 如果不存在,则返回-1
int i, j = 0;
int len_s=strlen(s);
int len_t=strlen(t);
if(pos&= len_s) return –1;
while(i & len_s && j & len_t){
if (s[i] == t[j]) {i++; j++;}
else{ i = i-(j-1); j=0;}
if (j &= len_t){return i-len_t-}
else return -1; } 自已写算法 性能分析 s:
ABABCABCACBAB
ABCAC 自已写算法 KMP算法 当模式串与主串失配时,模式串根据自身来确定滑动距离。
如何确定模式串每一次的滑动距离?
自已写算法 用next[j]表示模式中第j个字符与主串失配,则在模式中需重新和主串进行比较的位置 void get_next(char *t, int next[]){
int i = 0, j = -1;
next[i] = -1;
while(i&(strlen(t)-1)){
if(j==-1||t[i]==t[j]){
if(t[i]!=t[j]) next[i]=j;
else next[i]=next[j];
else j=next[j];
自已写算法 一般算法与KMP算法性能比较 一般算法: O(m*n) KMP算法:O(m+n)
其它一些字符串匹配著名算法 BM算法 BF算法 RK算法 自已写算法 优点 依整性小,不需要额外的库或工具支持 清晰,可以控制整个匹配过程
不足 不适合全文匹配 缺乏灵活性,无法进行动态匹配 Linux字符串匹配的手段 自已写算法
使用正则表达式
使用特定的工具
使用正则表达式 正则表达式的“祖先”可以一直上溯至对人类神经系统如何工作的早期研究。
Warren McCulloch 和 Walter Pitts 这两位神经生理学家研究出一种数学方式来描述这些神经网络。
1956 年, 一位叫 Stephen Kleene 数学家在McCulloch 和 Pitts 早期工作的基础上,发表了一篇标题为“神经网事件的表示法”的论文,引入了正则表达式的概念。
使用正则表达式 使用正则表达式 使用正则表达式 使用正则表达式 使用正则表达式 使用正则表达式 正则表达式的分类 POSIX 1003.2 定义
基本的正则表达式(BRE) 扩展的正则表达式(ERE) 未在POSIX 中定义 高级的正则表达式(ARE) 使用正则表达式 正则表达式的语法支持情况
使用正则表达式 在C语言中使用正则表达式 首先要将正则表达式进行编绎,将其转化为regex_t结构:
int regcomp(regex_t *preg, const char *regex, int cflags);
一旦成功地编译了正则表达式,接下来就可以调用regexec()函数完成模式匹配:
int regexec(const
char *string, size_t nmatch,regmatch_t pmatch[], int eflags);
typedef struct {
正在加载中,请稍后...

我要回帖

更多关于 正则表达式匹配字符串 的文章

 

随机推荐