我有一个文件列表:File_2011_1.txt
,File_2011_2.txt
,File_2011_3.txt
... File_2011_100.txt
;我想以所有文件名更新2011年到2012年。
以下不起作用:
for FILES in `ls`; do NEWNAME=`echo ${FILES} | sed -e 's/*2011*/*2012*/'`; echo ${FILES} ${NEWNAME}; done;
但这样做:
for FILES in `ls`; do NEWNAME=`echo ${FILES} | sed -e 's/File_2011*/File_2012*/'`; echo ${FILES} ${NEWNAME}; done;
那么,为什么在我要更改的文件名部分之前的通配符不起作用?
答案 0 :(得分:5)
因为sed不使用File willcard(就像在bash或DOS中那样),而是正则表达式(regular expressions)。
你可以只做sed -e 's/2011/2012/'
(默认情况下's'命令sed匹配字符串的一部分)。通配符*
将以正则表达式语言编写为.*
。
sed regexps的基本规则:
^
)与该行的开头匹配。$
)与该行的结尾匹配。*
)匹配前一个字符的零次或多次。.
)匹配任何字符。[
和]
用于匹配字符集,例如[a-c01]
与单个字符匹配:a
,b
,c
,0
或1
。