Как переименовать файлы с помощью sed?

Это выражение sed, которое было создано автором. Более конкретно, @ craig-sanders.

$ FileToMove установлен на «2012-09-01 Home insurance quote_zz20.pdf»

# use sed to extract folder number from filename. FolderNo=$(echo "$FileToMove" | sed -r -e 's/.*zz([0-9]+)\.pdf/\1/') # On my Mac, I figured that this command needs to be FolderNo=$(echo "$FileToMove" | sed -E -e 's/.*zz([0-9]+)\.pdf/\1/') 

Вышеприведенная команда используется для извлечения «20» из имени файла. Теперь я хочу заменить zz20 на null.

Старался это сделать. Изучит sed и прежде, чем нужно изучить регулярные выражения. Тем временем, я уверен, что просто заменить его нулевым. Какие-нибудь советы?

  • Как получить сигнал / сообщение об ошибке в сценарии?
  • имена, которые имеют наибольшее количество раз в наборе данных
  • Извлечь два значения из вывода команды
  • Измените dir из сценария без «процедуры оболочки» или «поиска сценария»,
  • Как выполнять команды, последовательно эмулируя пользователя на терминале с помощью сценария оболочки
  • Скрипт не ждет подпроцессов из цикла
  • Убедитесь, что только root может редактировать скрипт перед его выполнением
  • Найдите идентификатор процесса приложения java в сценарии bash (чтобы узнать, запущено ли целевое приложение)
  • 3 Solutions collect form web for “Как переименовать файлы с помощью sed?”

    Я предполагаю, что вы хотите переименовать файл, а также переместить его.

    Используя мой оригинальный скрипт в качестве базы, измените эту часть скрипта:

     if [ "$NumFolders" -eq 1 ] ; then mv "$ParentFolder/$FileToMove" "$TargetFolder/" else 

    к чему-то вроде этого:

     if [ "$NumFolders" -eq 1 ] ; then NewFileName=$(echo "$FileToMove" | sed -E -e 's/_zz[0-9]+\././') mv "$ParentFolder/$FileToMove" "$TargetFolder/$NewFileName" else 

    При переводе регулярного выражения на подробный английский сценарий sed заменяет «первое вхождение в строке ввода« _zz », за которым следуют один или несколько цифр, за которым следует буквальная полная остановка» с полной остановкой.

    т.е. как ответ Бена, он не будет делать правильные вещи с файлом с двумя или более последовательностями «_zz20 …». Достаточно легко заменить его регулярным выражением Birei (за исключением того, что вы избавитесь от слова «null» между \ 1 и \ 2, что заменит его литеральной строкой «null»):

     NewFileName=$(echo "$FileToMove" | sed -E -e 's/^(.*)zz[0-9]+(\.pdf)$/\1\2/') 

    BTW, это могло быть сделано с одной строкой и без временной переменной ($ NewFileName), но это проще понять.

    Если я понимаю ваш вопрос, вы не хотите ничего извлекать, только чтобы заменить литеральную строку zz20 null . В одну сторону:

     FolderNo=$(echo "$FileToMove" | sed -r -e 's/^(.*)zz[0-9]+(\.pdf)$/\1null\2/') 

    Он сохраняет в группе 1 все символы, пока zz20 и в группе 2 все символы после матча. Единственными символами, которые не были сохранены, будет zz20 который будет потерян и заменен null .

    Если вы хотите заменить концепцией null, а не текстом «null», вы можете использовать это:

     $ FolderNo=$(sed 's/_zz20//' <<< "2012-09-01 Home insurance quote_zz20.pdf") $ echo $FolderNo 2012-09-01 Home insurance quote.pdf 

    Это заменит первое появление _zz20 ничем. Это связано с тем, что вторая часть аргумента sed является пустой ( s/search/replace/ => s/_zz20// ).

    Мой пример не так осторожен, как тот, который вы цитируете, и тот, который предлагает @Birei. Если в каком-либо из ваших файлов есть несколько строк «_zz20», все не получится.

    Linux и Unix - лучшая ОС в мире.