#bash #sed
Вопрос:
У меня есть список ключей в ФАЙЛЕ:
FOO BAR BAZ
Я пытаюсь создать команду sed для замены каждой строки:
FOO=$FOO BAR=$BAR BAZ=$BAZ
Где правая сторона-это значение переменной env с таким именем. Например, установка переменных среды:
export FOO=1 export BAR=2 export BAZ=3
После запуска sed ФАЙЛ должен быть:
FOO=1 BAR=2 BAZ=3
Я пробовал эти:
sed -i 's/^(.*)$/1=$1/g'
sed -i "s/^(.*)$/1=$1/g"
sed -i s/^(.*)$/1="$1"/g'
И несколько других вариаций. Проблема явно в том, как происходит побег группы захвата, но я не знаю, как это исправить.
Комментарии:
1. Обязательно ли это должно быть sed? Используйте awk. Или питон.
2. Нет, это не так, с awk все в порядке. Я бы предпочел не использовать python.
3. Затем используйте python, вы закончите в кратчайшие сроки. Буквально
python -c 'for line in sys.stdin: print(line "=" os.getenv(line));
4.
The issue is clearly in how the capture group is escaped
Как это понять? Sed работает с текстом , он не заменяет$anything
последовательности значениями.5. «Очевидно», что, поскольку захват работает, добавление
=
работ, это просто расширение переменной от ИМЕНИ $до ЗНАЧЕНИЯ не работает.
Ответ №1:
Вы не можете получить доступ к переменным среды в sed теми способами, которые вы пытаетесь, но с awk это довольно просто:
awk '{ print $0 in ENVIRON ? $0"="ENVIRON[$0] : $0 } FILE gt;FILE.new amp;amp; mv FILE.new FILE || { echo oops; rm FILE.new; }
Ответ №2:
Это может сработать для вас (GNU sed):
sed 's/.*/echo "amp;=$amp;"/e' file
Используйте ссылку на сопоставление amp;
и флаг e
оценки в команде подстановки.