转载: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)()聚合表达式,被()起来的正则表达式模式可以当作标准字符,就是说可以对整个组再来做处理