использование команды 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 
  • Как вырезать каждую строку из определенной строки?
  • избегать разрыва строки
  • Согласование многострочного шаблона с помощью sed, awk или grep
  • анализировать HTML в Bash (когда grep просто недостаточно)
  • Как заменить начальный ноль пробелом в SED?
  • Распечатайте n строк до match1 И строки после match1 до match2
  • многострочная замена заменяет предыдущий вывод
  • Текстовые манипуляции: извлеките все внутри скобок
  • sed заменить текст url на html url
  • Как удалить все строки с «.png» в файле?
  • Сценарий оболочки для списка заблокированных пакетов во FreeBSD
  • Linux и Unix - лучшая ОС в мире.