2015-08-25 22 views
0

Командования ниже от этого ответа: https://stackoverflow.com/a/208220/3470343Regex - Переименование файлов с префиксом/суффиксом

Команда добавляет слово new. в качестве префикса. Это понятно.

rename 's/(.*)$/new.$1/' original.filename 

Однако, я хотел бы спросить, почему требуется открывать и закрывать скобки здесь:

(.*) 

А также почему $1 переменных, которая хранит имя исходного файла, почему не может Я, сделать то же самое со следующим (где я заменил $1 с $2):

rename 's/(.*)$/new.$2/' original.filename 

Я все еще относительно новое для ба sh, поэтому помощь будет принята с благодарностью.

+4

Это не имеет никакого отношения к BASH. Это основной синтаксис регулярных выражений. Прочтите основное учебное пособие по регулярному выражению. – anubhava

+0

Почему вы ожидаете, что вы можете просто случайно заменить одно расширение переменной другим? –

ответ

3

Во-первых, (.*)$ - это то, что известно как регулярное выражение (или регулярное выражение). Регулярные выражения используются для соответствуют текстам, основанным на некоторых правилах.

Например, .* соответствует нулю или нескольким символам. $ соответствует концу строки. Поскольку регулярные выражения по умолчанию являются жадными, .*$ соответствует всей строке (хотя, именно потому, что регулярные выражения жадные, $ является излишним).

Однако, я хотел бы спросить, почему требуется здесь открывать и закрывать скобки: (.*)

Круглые скобки обозначают группу. Группы используются для «сохранения» содержимого совпадающего текста, чтобы вы могли его использовать позже.

А также почему $1 переменная, которая хранит имя исходного файла, почему я не могу сделать то же самое со следующим (где я заменил $1 с $2): ...

В случае rename(1) первая группа хранится в $1, вторая группа хранится в $2 и так далее. Например, следующее регулярное выражение:

(a)(b)(c) 

хранит один a в $1, один b в $2 и так далее.

Там у вас есть только одна группа, поэтому вы должны использовать $1. Токены, такие как $2, $3, ... будут пустыми.

Последнее, но не менее, вы могли бы использовать более короткую, эквивалентную команду:

rename 's/^/new./' 

Здесь ^ обозначает начало строки.

Смежные вопросы