Renaming files in a loop

Chr*_*isW 0 unix bash

I have a list of files: File_2011_1.txt, File_2011_2.txt, File_2011_3.txt ... File_2011_100.txt; I want to update 2011 to 2012 in all the file names.

The following doesn't work:

for FILES in `ls`; do NEWNAME=`echo ${FILES} | sed -e 's/*2011*/*2012*/'`; echo ${FILES} ${NEWNAME}; done;
Run Code Online (Sandbox Code Playgroud)

but this does:

for FILES in `ls`; do NEWNAME=`echo ${FILES} | sed -e 's/File_2011*/File_2012*/'`; echo ${FILES} ${NEWNAME}; done;
Run Code Online (Sandbox Code Playgroud)

So, why does a wildcard in before the part of the filename I want to change not work?

osg*_*sgx 5

因为sed不使用File willcard(就像它在bash或DOS中),而是正则表达式(正则表达式).

你可以做(​​只是sed -e 's/2011/2012/'默认's'命令sed匹配字符串的一部分).通配符*将以.*正则表达式语言编写.

sed regexp的基本规则:

  • 插入符号(^)匹配行的开头.
  • 美元符号($)匹配该行的结尾.
  • 星号(*)匹配前一个字符的零次或多次出现.
  • 点(.)匹配任何字符.
  • []用于匹配字符集,例如[a-c01]:用单个字符的任何匹配a,b,c,0,或1.