использование команды sed для замены имен пробелами

У меня есть огромное количество файлов с некоторыми именами перед реальным именем файла. Ниже приведен пример проблемы:

Nora Hmann - sub-01.zip Nora Hmann - sub-02.zip Nora Hmann - sub-03.zip Nora Hmann - sub-04.zip Nora Hmann - sub-05.zip Nora Hmann - sub-06.zip 

Теперь, используя sed commnd, я хочу удалить Nora Hmann - и просто сохранить sub-01.zip . может ли кто-нибудь помочь мне с командой sed, поскольку строка, которая будет заменять, содержит пробелы, sed не делает ее правильно.

4 Solutions collect form web for “использование команды sed для замены имен пробелами”

Используйте следующую команду:

sed -ie "s/Nora\ Hmann\ \-\ //g" stack

до:

 Nora Hmann - sub-01.zip Nora Hmann - sub-02.zip Nora Hmann - sub-03.zip Nora Hmann - sub-04.zip Nora Hmann - sub-05.zip Nora Hmann - sub-06.zip 

после:

 sub-01.zip sub-02.zip sub-03.zip sub-04.zip sub-05.zip sub-06.zip 

Чтобы закодировать его (я предполагаю, что вы выполнили свой сценарий bash из каталога, где находятся все файлы, которые будут изменены):

 for i in `ls -w1` do sed -ie "s/Nora\ Hmann\ \-\ //g" /path/to/$i done 

Удаление списка имен для суффикса после последнего пробела:

 sed 's/.* //' 

Но если это пара файлов в каталоге, проще использовать rename :

 rename 's/^.* //' * 

Другое решение с помощью cut and sed :

 cat filename.txt | cut -d'-' -f2- | sed 's/^ //g' 

Другой только с cut (и только в случае имен состоят по имени и фамилии, разделенным пробелом):

 cat filename.txt | cut -d' ' -f4- 

С bash или ksh , если файлы находятся в текущем каталоге:

 for name in ./"Nora Hmann - sub-"??.zip; do newname="./${name##* }" mv -i "$name" "$newname" done 

Расширение параметра ${name##* } удалит все из $name вплоть до (и включая) последнего символа пробела.

Если имя в начале имени файла не определено, то следующее будет захватывать все файлы Zip и попытаться переименовать их таким же образом:

 for name in ./*.zip; do newname="./${name##* }" mv -i "$name" "$newname" done 

Я решил использовать mv -i в этих примерах, чтобы вы в интерактивном режиме должны были подтвердить любое переименование, которое заменило бы уже существующий файл.

Другой способ сделать это – просто пропустить файлы, которые в противном случае перезаписывали бы существующие файлы:

 for name in ./*.zip; do newname="./${name##* }" if [[ ! -e "$newname" ]]; then mv "$name" "$newname" else printf 'Not renaming "%s", new filename exists\n' "$name" >&2 fi done 
  • Как добавить строку в первое поле вывода с помощью awk?
  • Как удалить пустые строки в файле?
  • совпадение и добавление на основе позиции символа
  • Разбор таблицы текстовых файлов и агрегирование информации
  • Как я могу запустить sed для замены строк в файле или делать подобные вещи в PHP?
  • Как печатать строки с номерами 15 и 25 из каждых 50 строк?
  • Текст grep / parse
  • Заставить sed запрашивать подтверждение перед каждой заменой?
  • Как использовать awk или sed для преобразования csv в более читаемый формат
  • Как изменить столбец в строке в текстовом файле с разделителями табуляции, если он дублируется
  • удалить ведущую строку в bash
  • Linux и Unix - лучшая ОС в мире.