Perl正则表达式 2.1 三种形式[2]
匹配:m/<regexp>/ (可以省略m,直接写成/regexp/) 替换:s/<pattern>/<replacement>/ 转化:tr/<pattern>/<replacement>/博文[3]给出了8种模式,rename命令常用到替换和转化两种(用匹配也没意义)。 转换跟替换不同,替换是将replacement整个字符串替换pattern字符串,而转换则是用replacement逐个字符替换pattern逐个字符,结果依赖于replacement与pattern字符个数(见下述分析)。 (1)替换 替换表达方式如下[3],还有一系列参数,貌似不怎么用得着。
s/PATTERN/REPLACEMENT/egimosx e Evaluate the right side as an expression. g Match globally, i.e. all occurrences. i Case-insensitive pattern matching. m Treat string as multiple lines. o Only compile pattern once, even if variables within it change. s Treat string as single line. x Use extended regular expressions e评估右侧为表达式。 g全局匹配,即所有匹配项。 i不区分大小写的模式匹配。 m将字符串视为多行。 o仅编译一次模式,即使其中的变量发生变化也是如此。 s将字符串视为单行。 x使用扩展的正则表达式(2)转化 转化有两种等价表达方式,如下:
tr/SEARCHLIST/REPLACEMENTLIST/cds y/SEARCHLIST/REPLACEMENTLIST/cds c Complement the SEARCHLIST. d Delete found but unreplaced characters. s Squash duplicate replaced characters. c对SEARCHLIST进行补充。 d删除找到但未替换的字符。 s压缩重复替换的字符。转化同替换不同,用REPLACEMENTLIST逐个字符替换SEARCHLIST逐个字符,比如’tr/Sam/Stm/’,用S替代S,t替代a,m替代m。结果依赖于两者字符长短,下面以文件名FastSpiSam3C.nc为例进行说明:
rename -n ‘tr/Sam3/Stm/’ FastSpiSam3C.nc /替换字符短,用最后一个字符m替换3/ FastSpiSam3C.nc renamed as FtstSpiStmmC.nc
rename -n ‘tr/Sam3/Stm32/’ FastSpiSam3C.nc /替换字符长,多出字符被忽略/ FastSpiSam3C.nc renamed as FtstSpiStm3C.nc
参数c、d、s把我搞懵了,本想通过一系列操作,总结规律,结果徒劳。
正则表达式中的一些常用模式pattern[2]:
x? 匹配 0 次或一次 x 字符串 x* 匹配 0 次或多次 x 字符串,但匹配可能的最少次数 x+ 匹配 1 次或多次 x 字符串,但匹配可能的最少次数 .* 匹配 0 次或一次的任何字符 .+ 匹配 1 次或多次的任何字符 {m} 匹配刚好是 m 个 的指定字符串 {m,n}匹配在 m个 以上 n个 以下 的指定字符串 {m,} 匹配 m个 以上 的指定字符串 [] 匹配符合 [] 内的字符 [^] 匹配不符合 [] 内的字符 [0-9]匹配所有数字字符 [a-z]匹配所有小写字母字符 [^0-9]匹配所有非数字字符 [^a-z]匹配所有非小写字母字符 ^ 匹配字符开头的字符 $ 匹配字符结尾的字符 \d 匹配一个数字的字符,和 [0-9] 语法一样 \d+ 匹配多个数字字符串,和 [0-9]+ 语法一样 \D 非数字,其他同 \d \D+ 非数字,其他同 \d+ \w 英文字母或数字的字符串,和 [a-zA-Z0-9] 语法一样 \w+ 和 [a-zA-Z0-9]+ 语法一样 \W 非英文字母或数字的字符串,和 [^a-zA-Z0-9] 语法一样 \W+ 和 [^a-zA-Z0-9]+ 语法一样 \s 空格,和 [\n\t\r\f] 语法一样 \s+ 和 [\n\t\r\f]+ 一样 \S 非空格,和 [^\n\t\r\f] 语法一样 \S+ 和 [^\n\t\r\f]+ 语法一样 \b 匹配以英文字母,数字为边界的字符串 \B 匹配不以英文字母,数值为边界的字符串 a|b|c 匹配符合a字符 或是b字符 或是c字符 的字符串 abc 匹配含有 abc 的字符串 # rename -v 's/img_(\d{4})\.jpeg$/dan_$1\.jpg/' *.jpeg img_5418.jpeg renamed as dan_5418.jpg上面的例子中,子模式‘\d{4}’会捕捉4个连续的数字,捕捉的四个数字就是$1, 将会用于新的文件名。