2012-05-02 6 views
0

У меня есть список файлов: 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

Как ни странно, вы используете подстановочный знак, если не хотите, и 'ls', когда вы увидите [здесь] (http://mywiki.wooledge.org/BashPitfalls#for_i_in_.24.28ls_.2A.mp3 .29) для почему 'for Files in \' ls \ '...' - плохая идея. – potong

ответ

5

Потому что sed использует не File willcard (как это было в bash или DOS), а регулярное выражение (regular expressions).

Вы можете сделать только sed -e 's/2011/2012/' (по умолчанию 'команда sed соответствует части строки). Подстановочный знак * будет записан как .* в языке регулярных выражений.

Основные правила SED регулярных выражений:

  • Каретка (^) соответствует началу строки.
  • Знак доллара ($) соответствует концу строки.
  • Звездочка (*) соответствует нулю или больше вхождений предыдущего символа.
  • Точка (.) соответствует любому символу.
  • [ и ] используются для соответствия набора символов, например. [a-c01] спички с одним колесом любой из: a, b, c, 0, или 1.
Смежные вопросы