Сценарий Bash — замена последней запятой в именах папок на

#linux #bash

#linux #bash

Вопрос:

Мне нужна помощь в написании сценария Bash. Я хочу, чтобы он прошел через папку и переименовал все вложенные папки, чтобы заменить ПОСЛЕДНЮЮ запятую на амперсанд.

 for dir in /home/john/Documents/TEST/*; 
do 
    # ***This is the part I can't figure out***
done
 

Скажем, папка '1234 John, James, Jack' — я хочу, чтобы она стала '1234 John, James amp; Jack'

Комментарии:

1. Обратите внимание, что это был бы более серьезный вопрос, если бы вы показали свои неудачные попытки, поэтому у нас было лучшее представление о том, где именно вы зависли и почему. Это похоже на вопрос «пожалуйста, напишите мой код для меня», на который мы не одобряем.

2. Кстати, ваше описание не совсем соответствует вашим образцам данных — в описании говорится, что вы просто хотите переключить последнюю запятую в амперсанд в соотношении 1: 1, в образцовых данных говорится, что вы хотите заменить его пробелом, за которым следует амперсанд .

3. Повторяющийся целевой объект, используемый для закрытия этого вопроса, кажется неправильным. Я голосую за повторное открытие вопроса.

Ответ №1:

Это подходящая работа для расширения параметров; методы, использующие их для этой и подобных целей, также описаны в BashFAQ #100.

 for f in /home/john/Documents/TEST/*,*/; do  # final / means we match only directories
  f=${f%/}       # remove the last /
  front=${f%,*}  # front is everything before the last comma
  back=${f##*,}  # back is everything after the last comma
  mv -- "$f" "${front}amp;${back}"
done
 

Смотрите, как это демонстрируется в онлайн-репле по адресу https://ideone.com/XcY4rw

Ответ №2:

 for dir in /home/john/Documents/TEST/*,*/; 
do 
    newdir=$(echo "${dir}" | sed 's/(.*),/1amp;/')
    mv "${dir}" "${newdir}"
done
 

Вы можете просто использовать use sed для замены последней запятой в имени каталога на amp; .

Комментарии:

1. GNU bash, версия 5.0.3, работает отлично.

2. См . ideone.com/Jg3wNf для онлайн-реплика, показывающая проблему. Посмотрите, как он рассматривается /home/john/Documents/Test/John, как отдельный аргумент от James, or Jack/ ?

3. @CharlesDuffy Мне жаль говорить: это работает отлично. we.tl/t-zROk4hieXr (получите тестовый архив здесь)

4. pastebin.com/q6QJWc41 просто принесите это сюда, это примерно то же самое в конце

5. В вашем abc,abc,abc тестовом имени файла нет пробелов. Операция 1234 John, James, Jack выполняется.