模式匹配运算符–Shell
转载:http://www.firefoxbug.net/?p=722
Var=/home/firefox/MyProgram/fire.login.name
${Variable#pattern}:如果模式匹配于变量值的开头处,则删除匹配的最短部分,并且返回剩下的部分
例子:
[fire]$ echo ${Var#*/}
[fire]$ home/firefox/MyProgram/fire.login.name
[fire]$ echo ${Var#/*/}
[fire]$ firefox/MyProgram/fire.login.name
[fire]$ echo ${Var#*.}
[fire]$ login.name ${Variable##pattern}:如果模式匹配于变量值的开头处,则删除匹配的最长部分,并且返回剩下的部分
例子
[fire]$ echo ${Var##*/}
[fire]$ fire.login.name
[fire]$ echo ${Var##/*/}
[fire]$ fire.login.name
[fire]$ echo ${Var##*.}
[fire]$ name ${Variable%pattern}:如果模式匹配于变量值的结尾处,则删除匹配的最短部分,并且返回剩下的部分
例子
[fire]$ echo ${Var%/*}
[fire]$ /home/firefox/MyProgram
[fire]$ echo ${Var%.*}
[fire]$ /home/firefox/MyProgram/fire.login ${Variable%%pattern}:如果模式匹配于变量值的结尾处,则删除匹配的最长部分,并且返回剩下的部分
例子
[fire]$ echo ${Var%%/*}
[fire]$
[fire]$ echo ${Var%%.*}
[fire]$ /home/firefox/MyProgram/fire ${#Variable}:返回$Variable值里的字符长度
[fire]$ echo ${#Variable}
[fire]$ 39 #!/bin/bash
#移动当前目录下所有.c文件重命名为file-[Number].c,排序 loop=1;
while [ $loop -lt 10 ]
do
file="$loop.c"
touch $file
let loop++
done iCounter=1
for temp in *.c
do
New=file-$iCounter.${temp#*.}
mv $temp $New 2> /dev/null if [ $? -eq 0 ]; then
echo "rename $temp to $New"
let iCounter++
fi
done
shell:字符串模式匹配
bash提供了可操作路径名称字符串和其它字符串的字符串模式匹配运算符。
注意区分和通配符的区别:http://blog.sina.com.cn/s/blog_ac9fdc0b0101ls9h.html
还有正则表达式的区别:http://blog.sina.com.cn/s/blog_ac9fdc0b0101lvqp.html
*********************************************************************************************
# 删除最小的匹配前缀
## 删除最大的匹配前缀
% 删除最小的匹配后缀
%% 删除最大的匹配后缀
这些运算符的语法形式如下: ${ varname op pattern } (各种括号,晕了)
注意使用# pattern必须是匹配前缀的模式;
使用%,pattern必须死匹配后缀的模式,不然会出错;
注意这里的pattern不是正则表达式
*********************************************************************************************

这四个操作对它们的用法表达的很清楚了,注意一点//不是正则表达式的模式,而是指匹配name中的/符号。
下面是两个应用,提取文件的前缀名:

**********************************************************************************************
字符串的模式匹配实际上是可以处理任何字符串的匹配,不光光只是路径名
Shell:通配符
通配符,正则表达式二者的功能很像,但是又确实不一样,接触shell有段时间了,现在才意识到它们地不同,囧
。
比起他们的用法,使用范围其实更加令人困惑,什么时候使用的是通配符,什么时候使用的正则表达式,一直搞不清楚。
*********************************************************************************************
通配符(模糊文件引用)
当输入包含特色字符(也称为元字符)的部分文件名时,shell可以生成已有文件名匹配的文件名(来自《Linux命令,编辑器与shell编程》P119,难道只通配符的使用只适用于文件名的匹配?)。
这些特殊的字符也称为通配符,当某个特殊字符作为参数出现在命令行上时,shell将该参数扩展为有序的文件名列表,并将列表传递给命令行的调用程序。包含特殊字符的文件名称为模糊文件引用,因为它们不引用任何一个特定文件,对这些文件名操作的扩展称为扩展路径名或者通配。
======================================================
(1)?:它与已有文件名的某个单独字符匹配
=======================================================
(2)*:它与文件名中的任意多个(包括0个)字符匹配
=======================================================
(3)[ ]:与包含[ ]内字符的文件名进行匹配
========================================================
(4)[! ]或[^ ]:表示该类与任何不在括号内的字符匹配:
**********************************************************************************************
在引用文件名的时候,使用通配符~~~
,正则表达式的内容很长,单独写一个文章来分析。
正则表达式在这里:http://blog.sina.com.cn/s/blog_ac9fdc0b0101lvqp.html
Shell:Regex正则表达式
正则表达式和通配符,字符串的模式匹配是存在区别的,目前我所知道的是用在grep -E , awk , sed中。
通常使用这种结构 /pattern/ action,对匹配到pattern执行相应的action操作。
*********************************************************************************************
正则表达式是由描述一系列字符串的简洁的符号组成,正则表达式的基本元素如下:
(1)普通字符:a-z A-Z 0-9 空格 下划线等字符;
(2)元字符:. * [ ] ^ $ { } \ + ? | ( )等特殊含义的字符;
还有扩展正则表达式,多了+ ?的元字符,但是只在grep -E中有用,sed和awk中不行。
*********************************************************************************************
常规正则表达式
(1)/chenhuan/ 精确的匹配chenhuan

(2). 可替代任何单个字符

(3)* 可替代0个或多个它前面的字符(注意理解和通配符的区别)

因为可以匹配0个,所以比较难理解下面这几个的含义:

红色的表示匹配到的,注意*匹配的是和它前面的字符配套的,a*是匹配“ ”或“aaaa...”,而且注意*试图寻找最大匹配,注意理解前面的和最后.*的区别,这里的*和通配符中的*很容易搞混,其实正则表达式中.*才等于通配符中*。
(4)[ ] 字符集
.的主要限制是让你不能指定匹配的字符集,可以使用[a-zA-Z],[0-9],注意这里实际上也只是匹配一个字符:

(5)^ 放在[]中表示取反的意思,[^0-9]表示不匹配数字

(6)^放在//开头定位表达式/^chen/表示以chen开头,/chen$/表示以chen结尾:

(7)$ 放在末尾表示精确匹配末尾

**********************************************************************************************
下面是扩展的正则表达式,gawk和grep -E可以识别扩展的正则表达式,sed不行
(1)? 表示前面的字符可以出现0次或1次

(2)+ 和*非常相似,但+前的字符必须至少出现一次

(3){} 为可重复的正则表达式指定一个上限
m:正则表达式准确出现m次;
m,n:正则表达式至少出现m次,至多n次;
对于gawk,需要使用--re-interval来指定使用匹配区间

(4)| 管道符号,实际上就是或的意思

(5)()聚合表达式,被()起来的正则表达式模式可以当作标准字符,就是说可以对整个组再来做处理

模式匹配运算符–Shell的更多相关文章
- 替换运算符 shell
${变量:-word}如果变量存在且非空,则返回其值:否则返回word 用于:如果变量未定义,则返回默认值即word ${变量:+word}如果变量 ...
- Linux Shell常用技巧(十一)
二十二. 交互式使用Bash Shell: 1. 用set命令设置bash的选项: 下面为set主要选项的列表及其表述: 选项名 开关缩写 描述 allexport -a 打开此开关, ...
- linux 9 -- 交互式使用Bash Shell
二十二. 交互式使用Bash Shell: 1. 用set命令设置bash的选项: 下面为set主要选项的列表及其表述: 选项名 开关缩写 描述 allexport -a 打开此开关 ...
- [Linux]Shell的运算符和特殊变量
说起Shell脚本,免不了用变量.特别是对于这种一堆符号表示变量的语言来说,你不了解一下相关变量的本意,根本无从下手.譬如写个循环遍历,$#就起了好大作用.所以还是有必要记录一下,也是对学习的一个笔记 ...
- Linux基础之-shell script(变量,运算符,流程控制,函数)
一.shell script Shell 脚本(shell script),是一种为shell编写的脚本程序.业界所说的shell通常都是指shell脚本,但读者朋友要知道,shell和shell s ...
- Shell基础:变量类型 & 运算符
Shell变量 Shell支持三种类型的变量 用户自定义变量:用户自定义的变量,变量名以英文字母或下划线开头,区分大小写. 位置变量:根据位置传递参数给脚本的变量,默认支持9个位置变量 $1,$2,$ ...
- Linux学习——shell编程之运算符
shell编程之运算符 一:shell中常见算术运算符号和优先级 二:算术运算符 Shell 变量:是弱类型!不能进行加减乘除!比较麻烦! 例子 :shell变量弱类型 a=11 b=22 echo ...
- Shell教程 之运算符
1.Shell基本运算符 Shell 和其他编程语言一样,支持多种运算符,包括: 算数运算符: 关系运算符: 布尔运算符: 字符串运算符: 文件测试运算符. 原生bash不支持简单的数学运算,但是可以 ...
- Shell学习心得(二):传递参数、运算符
1.传递参数 可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n.n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推…… 向脚本传递三个参数, ...
随机推荐
- oracle文件管理OMF
OMF是为了简化对数据文件的管理,靠参数DB_CREATE_FILE_DEST实现: 如果定义了DB_CREATE_FILE_DEST,则创建表空间就不需要制定数据文件位置.文件名称,数据文件会按照固 ...
- 在asp.net mvc中使用PartialView返回部分HTML段
问题链接: MVC如何实现异步调用输出HTML页面 该问题是个常见的 case, 故写篇文章用于提示新人. 在asp.net mvc中返回View时使用的是ViewResult,它继承自ViewRes ...
- [Hive - LanguageManual ] Explain (待)
EXPLAIN Syntax EXPLAIN Syntax Hive provides an EXPLAIN command that shows the execution plan for a q ...
- 基于互联网的VOIP电话系统组建
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://wangchunhai.blog.51cto.com/225186/42379 ...
- Hibernate的常用关键类以及接口介绍
上一篇初步的对Hibernate进行了认识,并测试了Hibernate的HelloWorld, 这里主要介绍HibernateTest类中的相关类和接口,以及其作用和特性,关于Session中的相关方 ...
- Spring Autowiring by Constructor
In Spring, "Autowiring by Constructor" is actually autowiring by Type in constructor argum ...
- jquery easyui中的dialog拖动超出浏览器问题解决办法
juqery easyui当鼠标点着拖动超出浏览器后,就回不来了,拉不下的问题: //控制dialog超出浏览器回到原来的地方 var default_left; var default_top;// ...
- MVC3 使用NPOI导出excel
NPOI的官方教程:http://tonyqus.sinaapp.com/tutorial 此次项目中使用的是NPOI的1.25版本,项目是MVC3,在这里只贴上controller部分的代码: 1 ...
- linux常用命令-搜索
1.find $ find . -name nginx* $ find . -name nginx* -ls $ find . -type f -mmin -10 搜索当前目录中,所有过去10分钟中更 ...
- Linux下的C高级编程---学习
一.进程 一个正在运行的程序称为进程.例如在屏幕上正打开两个终端窗口,则说明同一个终端程序正在做为两个进程而同时执行,而每个终端窗口又都在执行shell,则每个shell又是另外一个进程 ...