Ваша попытка была успешной в большинстве случаев, но часть, касающаяся изменения содержимого файла, неверна в обеих попытках.
Problem 1
Вы были удивлены, что приведенная ниже попыткане заменил содержимое файла.Это не так.
CFILE="${CFILENAME/$CFILENAME/"$replace"}"
Потому что выше - внутренняя конструкция bash
для замены строки.Он просто заменяет содержимое строки, хранящейся в переменной CFILENAME
, и устанавливает результат в CFILE
.Изменение файла вообще не производится.
Судя по вашим данным, ваш CFILENAME
будет иметь значение src/aura/camping/camping.design
, а переменная replace
будет src/aura/camping
.Выполнение вышеизложенного приведёт строку src/aura/camping
к переменной CFILE
, а , а не к файлу, указанному переменной CFILE
.
Problem 2
Похоже, вы определили, что sed
решит вашу проблему, которая находится на правильном пути, но вы, кажется, пропустили пару уловок.
- В вашей переменной
sed
определены переменныепоиск и замена запчастей, но проблема с кавычками.Переменные в оболочке bash
не расширяются при одинарных кавычках, а только в двойных кавычках. Следующая проблема связана со строкой де-ограничителя, используемой в sed
, которая по умолчанию /
.Но помните, что и в исходной, и в замещающей строках присутствует /
, поэтому sed
не поймет, что такое исходный текст и текст замены.Вам нужно определить de-limiter, который не является /
, а также любой метасимвол, который не является частью вашей строки.Я бы порекомендовал |
в вашем случае
sed "s|$CFILENAME|$replace|" final.txt
Теперь самая большая проблема связана с флагом -i
в вашей команде sed
, что означает редактирование файлов на месте.в то время как.Помните, что вы читаете файл в цикле с построчным построением while read
, и теперь вы редактируете этот файл после анализа каждой строки.Вы ошибаетесь с изменением направления оболочки здесь.Идеальный способ - перенаправить построчное редактирование во временный файл и переместить его в исходный файл после завершения цикла.
sed "s|$CFILENAME|$replace|" final.txt >> temp_final.txt
Примерно так же, как и выше, используя >>
, который добавляет к файлу.И как только цикл завершится, вернитесь к исходному файлу, используя mv
mv -- temp_final.txt final.txt