Вопрос чайника 2 заменить в файле

  1. 2 г. назад

    Наверняка частая задача, все уже сталкивались.
    Если некоторый конфиг файл myfile.txt вида
    user=${USER}
    password=${PASSWORD}
    .....
    Мне нужно в файлике скриптом поменять все вхождения вида ${XXX} на значение, которое лежит в env переменной $XXX,
    Например, надо поменять все ${USER} на значение из переменной $USER

    Казалось бы херня-вопрос. И тут же всем на ум приходит команда

    sed 's/${USER}/'"$USER"'/g' myfile.txt

    Казалось бы, но нихера
    Эта команда расхерачивает имя юзера, если в нем используются символы регекса. Например domain\user превращается в domainuser
    Попробовал что то такое

    sed 's/${USER}/'`echo $USER | sed 's/\\\\/\\\\\\\\\\\\\\\\/g'`'/g' myfile.txt

    - - ну т.е. поменять предварительно все \ на \\ а потом уже вставлять в выражение основной замены
    Оно корректно отработало на domain\user, но это херота какая то некрасивая. К тому же, а если в $PASSWORD будет символ точки или еще чего похуже? Мне каждый знак менять?

    И отсюда вопрос: как без особой боли решить эту простую задачу?

    Ответы: (2) (7)
  2. 21.01.2022 12:33:36 отредактировано NewTesla

    Бро, ты мне подсказывал по Java и по - моему по 1с
    ща найдем!

  3. sda553 Наверняка частая задача, все уже сталкивались.
    Если некоторый конфиг файл myfile.txt вида
    user=${USER}
    password=${PASSWORD}
    .....
    Мне нужно в файлике скриптом поменять все вхождения вида ${XXX} на значение, которое лежит в env переменной $XXX,
    Например, надо поменять все ${USER} на значение из переменной $USER

    Казалось бы херня-вопрос. И тут же всем на ум приходит команда

    sed 's/${USER}/'"$USER"'/g' myfile.txt

    Казалось бы, но нихера
    Эта команда расхерачивает имя юзера, если в нем используются символы регекса. Например domain\user превращается в domainuser
    Попробовал что то такое

    sed 's/${USER}/'`echo $USER | sed 's/\\\\/\\\\\\\\\\\\\\\\/g'`'/g' myfile.txt

    - - ну т.е. поменять предварительно все \ на \\ а потом уже вставлять в выражение основной замены
    Оно корректно отработало на domain\user, но это херота какая то некрасивая. К тому же, а если в $PASSWORD будет символ точки или еще чего похуже? Мне каждый знак менять?

    И отсюда вопрос: как без особой боли решить эту простую задачу?

    Легкотня же. Бери любую готовую библиотеку по парсингу .env файлов для того ЯП на котором ты умеешь программировать, и используй ее. Зачем самому что-то придумывать что уже давно придумано?

    Ответы: (3) (9)
  4. 21.01.2022 19:09:33 отредактировано sda553

    (2) баш скриптом надо. Для докерфайла. Никаких яп так что, все по минимуму. Девопс, блд

    Ответы: (4) (9)
  5. 21.01.2022 22:35:41 отредактировано Bumer

    sda553 все по минимуму. Девопс, блд

    Я уставший сонный ... может что не понял. А почему не считать файл в строку, потом с ней сделать всё что надо, файл очистить и записать готовую строку?

    Ответы: (5)
  6. (4) да легко, sed именно этим и занимается. Дьявол в деталях, кои и описаны в исходном сообщении

  7. https://ru.m.wikipedia.org/wiki/Sed

  8. sda553 И отсюда вопрос: как без особой боли решить эту простую задачу?

    Может задачу можно еще упростить? Расскажи, зачем ты в файле заменяешь эти строки.

    Ответы: (8)
  9. 22.01.2022 00:59:35 отредактировано sda553

    (7) ну,, тут все просто:
    Как известно, обычно опеншифт хранит пароли и другие конфиг данные в так называемых configmaps.
    Создавая pod, опеншифт устанавливает все эти данные в env переменных внутри Pod. Соответственно контейнер должен эти переменные считать и использовать при создании виртуалки.
    Я пытаюсь поднять в опеншифте виртуалку со сторонним приложением, которое требует конфиг файл для своего запуска.
    Чтобы подсунуть приложению этот конфиг файл, я создал болванку конфиг файла с ${xxx} вставками, потом опеншифт запускает виртуалку, стартует мой скрипт, в скрипте я выполняю замену этих ${xxx} на значения из env, любезно предоставленные опеншифтом, и вуаля! Приложение запускается с нормальным конфиг файлом. Профит.
    На мой взгляд, упрощать дальше некуда, только усложнять

  10. sda553 (2) баш скриптом надо. Для докерфайла. Никаких яп так что, все по минимуму. Девопс, блд

    шо, неужели и питона нету?

    Ответы: (10) (11)
  11. (9) тогда потребуется исходный образ с питоном Это как то накладно для выполнения одной задачи.

    Ответы: (11)
  12. sda553 (9) тогда потребуется исходный образ с питоном Это как то накладно для выполнения одной задачи.

    в чем вы видите накладность? (genuine interest)

  13. 22.01.2022 11:12:08 отредактировано ЗлобнийМальчик

    я в том смысле, что вроде бы питон легко ставится и ничего практически не весит. А потенциальные плюсы от использования языка программировани вместо баш скриптов или чего у вас там лично для меня очевидны
    оптимизировать время программиста это обычно полезная стратегия

или зарегистрируйтесь чтобы ответить!