转载: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的更多相关文章

  1. 替换运算符 shell

        ${变量:-word}如果变量存在且非空,则返回其值:否则返回word                  用于:如果变量未定义,则返回默认值即word      ${变量:+word}如果变量 ...

  2. Linux Shell常用技巧(十一)

    二十二. 交互式使用Bash Shell:     1.  用set命令设置bash的选项:    下面为set主要选项的列表及其表述: 选项名 开关缩写 描述 allexport -a 打开此开关, ...

  3. linux 9 -- 交互式使用Bash Shell

    二十二. 交互式使用Bash Shell:     1.  用set命令设置bash的选项:     下面为set主要选项的列表及其表述: 选项名 开关缩写 描述 allexport -a 打开此开关 ...

  4. [Linux]Shell的运算符和特殊变量

    说起Shell脚本,免不了用变量.特别是对于这种一堆符号表示变量的语言来说,你不了解一下相关变量的本意,根本无从下手.譬如写个循环遍历,$#就起了好大作用.所以还是有必要记录一下,也是对学习的一个笔记 ...

  5. Linux基础之-shell script(变量,运算符,流程控制,函数)

    一.shell script Shell 脚本(shell script),是一种为shell编写的脚本程序.业界所说的shell通常都是指shell脚本,但读者朋友要知道,shell和shell s ...

  6. Shell基础:变量类型 & 运算符

    Shell变量 Shell支持三种类型的变量 用户自定义变量:用户自定义的变量,变量名以英文字母或下划线开头,区分大小写. 位置变量:根据位置传递参数给脚本的变量,默认支持9个位置变量 $1,$2,$ ...

  7. Linux学习——shell编程之运算符

    shell编程之运算符 一:shell中常见算术运算符号和优先级 二:算术运算符 Shell 变量:是弱类型!不能进行加减乘除!比较麻烦! 例子 :shell变量弱类型 a=11 b=22 echo ...

  8. Shell教程 之运算符

    1.Shell基本运算符 Shell 和其他编程语言一样,支持多种运算符,包括: 算数运算符: 关系运算符: 布尔运算符: 字符串运算符: 文件测试运算符. 原生bash不支持简单的数学运算,但是可以 ...

  9. Shell学习心得(二):传递参数、运算符

    1.传递参数 可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n.n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推…… 向脚本传递三个参数, ...

随机推荐

  1. trie树 Codeforces Round #367 D Vasiliy's Multiset

    // trie树 Codeforces Round #367 D Vasiliy's Multiset // 题意:给一个集合,初始有0,+表示添加元素,-去除元素,?询问集合里面与x异或最大的值 / ...

  2. KMP(字符串匹配)

    1.KMP是一种用来进行字符串匹配的算法,首先我们来看一下普通的匹配算法: 现在我们要在字符串ababcabcacbab中找abcac是不是存在,那么传统的查找方法就是一个个的匹配了,如图: 经过六趟 ...

  3. Activating Google Cloud Storage

    先决条件 你需要下面的内容: 1.一个Google账户,比如来自Gmail.如果你没有,请在Google account signup site注册. 2.一个新的或已经存在的Google Devel ...

  4. 关于OpenCV做图像处理内存释放的一些问题

    转载:http://blog.sina.com.cn/s/blog_67a7426a0101czyr.html 工程运行,发现内存持续增长,到一定的时候就发生了内存泄漏. 内存泄露的定义 内存泄露是说 ...

  5. mac搭建PHP开发环境

    在Mac系统上搭建Php服务器环境: LAMP: Linux Apache MySQL PHP MAMP: MACOS APACHE(自带) MYSQL(需自己安装) PHP(自带) 一.APACHE ...

  6. JAVA基础----java中E,T,?的区别

    遇到<A>,<B>,<K,V>等,是用到了java中的泛型. 一般使用<T>来声明类型持有者名称,自定义泛型类时,类持有者名称可以使用T(Type) 如 ...

  7. B+树|MYSQL索引使用原则

    MySQL一直了解得都不多,之前写sql准备提交生产环境之前的时候,老员工帮我检查了下sql,让修改了一下存储引擎,当时我使用的是Myisam,后面改成InnoDB了.为什么要改成这样,之前都没有听过 ...

  8. 第二百四十九天 how can I 坚持

    竟然让我跟着他们去旅游..泡温泉,滑雪..西北坡,不去白不去. 罗娜,你别把我拉黑啊.哎,不知道咋办. 晚上玩了四局LOL,全输了,伤心. 还有今天抢票没抢到. 该怎么破,12点半正好在吃饭啊. 睡觉 ...

  9. 第三次作业,GUI设计之最大子序列和

    先吐槽一发!!!学渣表示作业太难了啊!!!!!!做一次作业要用好久好久,要问好多好多大神才能行,虽然确实提高不少,花的时间真是……!!!!! 这次作业费劲心血,希望老师能给个好分数,至少对于学渣来说已 ...

  10. Android实例-获取程序版本号(XE10+小米2)

    相关资料: 383675978群号 实例源码: unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, Sy ...