Итератор For Loop into Sed стирает весь файл

Я могу `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 не увенчалась успехом.

Проверьте этот вопрос: Переменные оболочки в сценарии sed Используйте двойные кавычки вместо одинарных кавычек вокруг вашего сценария sed.

JNevill 18.03.2022 16:50

@JNevil, к сожалению, нет, по-прежнему стирает весь файл при запуске этого sed.

user7823016 18.03.2022 16:53

две проблемы... 1) JNevil обратился к вопросу об использовании переменных bash в сценарии sed... 2) -n подавляет нормальный вывод (в стандартный вывод), что означает, что -i нечего записывать в файл (решение: удалить -n)

markp-fuso 18.03.2022 18:19

В качестве дополнительного комментария повторный запуск sed -i в цикле также является антипаттерном. Вместо этого выясните, как объединить команды, которые вы хотите запустить, в один сценарий. См. также stackoverflow.com/questions/7657647/combining-two-sed-comman‌​ds

tripleee 21.03.2022 06:54
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
35
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я смог выяснить, в чем проблема, но не совсем понял, в чем проблема.

-n «Подавить автоматическую печать пространства шаблонов» по ​​какой-то причине саботировал команду. Если у кого-то есть понимание, почему это будет очень признательно!

при использовании флага -n (подавить автоматическую печать) вы должны явно указать sed, когда что-то печатать, например: с помощью команды p: sed 's/.../.../p

markp-fuso 18.03.2022 17:10

@markp-fuso Я не думал, что моя проблема связана с печатью. Мне было все равно, печатается ли что-нибудь на консоли, я просто хотел, чтобы строки были перезаписаны в моем файле, и -n мешал этому?

user7823016 18.03.2022 17:34
-i говорит записать стандартный вывод в файл; -n говорит ничего не отправлять на стандартный вывод; если намерение состоит в том, чтобы сохранить все данные в файле (плюс желаемые изменения/замены), просто удалите -n
markp-fuso 18.03.2022 17:56

@markp-fuso ах, так что -n напрямую сводит на нет -i.

user7823016 18.03.2022 18:15

без каких-либо других действий/указов (например, print), эффективно, да

markp-fuso 18.03.2022 18:16

@ user7823016 -n не имеет ничего общего с -i. Скажем так: sed 's/a/ONE/g' file.xml (примечание: нет -iили-n) выведет файл, в котором все «a» заменены на «ONE». Если вы добавите -i, он заменит исходный файл этой измененной версией. Если вы удалите -i и вместо этого добавите -n, он выведет ничего, потому что было сказано не печатать измененные версии каждой строки. Если вы вставите и -n, и -i, он заменит исходный файл этим ничем — -i перенаправит ничто из терминала в файл.

Gordon Davisson 18.03.2022 18:52

@GordonDavisson, в этом гораздо больше смысла. Хотел бы я дать вам чек "Решенная проблема".

user7823016 18.03.2022 18:53

Другие вопросы по теме