轉載: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++
doneiCounter=1
for temp in *.c
do
New=file-$iCounter.${temp#*.}
mv $temp $New 2> /dev/nullif [ $? -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)()聚合表達式,被()起來的正則表達式模式可以當作標準字符,就是說可以對整個組再來做處理