У меня есть каталог, который содержит несколько файлов со следующим шаблоном.

1953-МАДАМА БАБОЧКА

1953-МАДАМА БАБОЧКА_001

Я пытаюсь переименовать их, чтобы добиться следующего:

МАДАМА БАБОЧКА [1953]

МАДАМА BUTTERFLY_001 [1953]

Это означало бы удалить «-» и заключить год в квадратные скобки. Поскольку чисел больше, чем за год, я думаю, что команда должна соответствовать только числам с четырьмя цифрами.

Я прочитал документацию по sed и не нашел решения своей проблемы. Возможно ли достичь моей цели с помощью sed? Заранее спасибо.

3 ответа3

0

Чтобы переименовать все файлы в каталоге, используйте

ls -1|sed -r 's/^([0-9]{4})(-)(.*)$/mv "&" "\3[\1]"/g'|sh

протестирован с GNU sed version 4.2.1

0

Использование расширенных регулярных выражений (-r):

sed -rn -e 's/^([0-9]{4})-(.*)$/\2[\1]/p' /tmp/input_file

Или то же самое без расширенных регулярных выражений (добавлено несколько обратных косых черт):

sed -n -e 's/^\([0-9]\{4\}\)-\(.*\)$/\2[\1]/p' /tmp/input_file

В обоих случаях самое важное - сопоставить любую цифру ([0-9]) ровно 4 раза {4} . Мы хотим убедиться, что перед этими цифрами ничего нет, поэтому используйте ^ который является началом строки, и ничего после них, поэтому мы добавляем - . Вы можете изменить - на что-то вроде [^0-9] что означает что угодно, кроме цифры, если возможно, что там будет другой символ, кроме - или просто отбросить это, если цифры также допустимы.

Вы также можете использовать ? если необходимо, сделать, например, первую группу цифр необязательной, и просто напечатать имя файла без каких-либо изменений, если нет совпадения.

0

Вы можете сделать это в чистом виде:

for f in [0-9][0-9][0-9][0-9]-*; do
  mv "$f" "${f:5}[${f:0:4}]"
done

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .