Я могу `sed -i 's/a/ONE/g' file.xml без проблем, но попытка запустить скрипт и передать переменные массива стирает весь файл.
declare -a arr=("a" "b")
declare -a ray=("ONE" "TWO")
for i in "${!arr[@]}"
do
sed -n -i 's/${arr[$i]}/${ray[$i]}/g' $file
done
Ожидаемый результат:
Я должен заменить все экземпляры a и b на ОДИН и ДВА соответственно.
Как я уже сказал, я смог выполнить это из командной строки с помощью
sed -i 's/a/ONE/g' file.xml
Что дает?
Обновлено:
Попытка предложенного исправления с использованием двойных кавычек в команде sed
не увенчалась успехом.
@JNevil, к сожалению, нет, по-прежнему стирает весь файл при запуске этого sed.
две проблемы... 1) JNevil обратился к вопросу об использовании переменных bash
в сценарии sed
... 2) -n
подавляет нормальный вывод (в стандартный вывод), что означает, что -i
нечего записывать в файл (решение: удалить -n
)
В качестве дополнительного комментария повторный запуск sed -i
в цикле также является антипаттерном. Вместо этого выясните, как объединить команды, которые вы хотите запустить, в один сценарий. См. также stackoverflow.com/questions/7657647/combining-two-sed-commands
Я смог выяснить, в чем проблема, но не совсем понял, в чем проблема.
-n
«Подавить автоматическую печать пространства шаблонов» по какой-то причине саботировал команду. Если у кого-то есть понимание, почему это будет очень признательно!
при использовании флага -n
(подавить автоматическую печать) вы должны явно указать sed
, когда что-то печатать, например: с помощью команды p
: sed 's/.../.../p
@markp-fuso Я не думал, что моя проблема связана с печатью. Мне было все равно, печатается ли что-нибудь на консоли, я просто хотел, чтобы строки были перезаписаны в моем файле, и -n
мешал этому?
-i
говорит записать стандартный вывод в файл; -n
говорит ничего не отправлять на стандартный вывод; если намерение состоит в том, чтобы сохранить все данные в файле (плюс желаемые изменения/замены), просто удалите -n
@markp-fuso ах, так что -n
напрямую сводит на нет -i
.
без каких-либо других действий/указов (например, p
rint), эффективно, да
@ user7823016 -n
не имеет ничего общего с -i
. Скажем так: sed 's/a/ONE/g' file.xml
(примечание: нет -i
или-n
) выведет файл, в котором все «a» заменены на «ONE». Если вы добавите -i
, он заменит исходный файл этой измененной версией. Если вы удалите -i
и вместо этого добавите -n
, он выведет ничего, потому что было сказано не печатать измененные версии каждой строки. Если вы вставите и -n
, и -i
, он заменит исходный файл этим ничем — -i
перенаправит ничто из терминала в файл.
@GordonDavisson, в этом гораздо больше смысла. Хотел бы я дать вам чек "Решенная проблема".
Проверьте этот вопрос: Переменные оболочки в сценарии sed Используйте двойные кавычки вместо одинарных кавычек вокруг вашего сценария sed.