Серия команд, которые вы упоминаете в вопросе, не добавляет каретку -возвращает (^M
вещи )в ваш текстовый файл.
Однако, если в файле уже есть символы каретки -в конце каждой строки, которые есть во всех текстовых файлах DOS, тогда в файл будут добавлены не -строки DOS, что означает, что текстовый файл, после редактирования некоторые строки являются текстовыми строками Unix, а некоторые строки являются текстовыми строками DOS. В каком бы редакторе вы ни просматривали файл, он должен попытаться выяснить, что с этим делать, и решить отобразить его как текстовый файл Unix с отображением возврата каретки -, поскольку^M
(vim
сделал бы это, например ).
Решение состоит в том, чтобы запустить dos2unix
для вашего файла wp-config.php
. Он мог бы обрабатывать смешанные типы строк и преобразовывал бы весь файл в текстовый файл Unix.
Также обратите внимание, что ed
сценарий редактирования не будет чисто заменять строку put your unique phrase here
в документе. Учитывая документ
000
AAA
put your unique phrase here
BBB
XXX
... последовательность команд будет генерировать
000
AAA
BBB
define('AUTH_KEY',...
...
XXX
(обратите внимание на расположение строки BBB
до и после ). Чтобы исправить это, чтобы строки define
добавлялись перед BBB
в тексте выше, измените команду a
на команду i
, т.е. вставьте перед текущей строкой , а не добавляйте после нее. ("текущая строка" будет строкой BBB
, так как эта строка находится сразу после строки, измененной командой g//d
).
Добавление строк в начале файла не так просто, как кажется, и обычно используется временный файл (, подобный тому, что sed -i
делает )за сценой.
cat > data.new && mv data.new "$profile_target"
или более быстрое решение, но требующее внешнего инструмента(sponge
изmoreutils
):
cat - "$profile_target" | sponge "$profile_target"
Примечание:
Это не проверяет, является ли ввод пустым (исходящим из стандартного ввода ), потому что если это так, он добавит пробел/пробел в начале файла.
Это также не приводит к ошибкам дескриптора. Поэтому убедитесь, что у вас есть резервная копия любого файла, в котором вы это используете, или используйте более безопасный подход.
Замените эту команду версией GNU sed.
tee -a "$profile_target"
sed -i -e '1r /dev/stdin' -e '1N' "$profile_target"