Конструкция Sed заполняет список ключей значением среды этого ключа

#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 оценки в команде подстановки.