Можно ли напрямую преобразовать файл, содержащий несколько переменных, в формат JSON с помощью командной строки?

Вы можете сравнить строку (слово )с несколькими другими с помощью фильтра , который возвращает все, совпадающие со словом. Например,

...
OLDER_FREEBSD  = 7.2-RELEASE-p2
M = $(filter $(PLATFORM),$(OLD_FREEBSD) $(OLDER_FREEBSD))
ifneq ($(M),)
...

2
11.06.2021, 09:35
1 ответ

С zshи при условии, что файл имеет синтаксис, совместимый с синтаксисом zsh, что файл не использует функции расширения оболочки (, такие как var1=~/foo, var2=$var1, var3=$(uname)... )и что значения представляют собой текст, закодированный в UTF -8, вы можете сделать:

tokens=( ${(Q)${(zZ[nC])"$(<file)"}} )

Чтобы разметить содержимое этого файла в соответствии с синтаксисом оболочки (, используя флаг расширения параметра z, подправленный (с помощьюZ[flags]n, чтобы рассматривать символы новой строки без кавычек как пробелы, а Cкак разделите комментарии оболочки )и удалите один слой цитирования с помощью флага раскрытия параметра Q.

Затем вы можете передать эти токены чему-то, что может кодировать json (позаботиться об управляющих символах, включая новую строку, обратную косую черту, "символы и т. д.):

perl -CA -MJSON -le '
  for (@ARGV) {
    if (/(.*?)=(.*)/s) {
      $h{$1} = $2;
    }
  }
  print encode_json \%h' -- $tokens

Например, один a file, такой как:

var1='a random text' # comment
var2='another'\'' random text'
var3='a third random text'

name=$'St\u00e9phane Chazelas'
empty=
at=@
more=broken\
down"with 1 \\ backslash"
numstring=1.1

Дает:

{"numstring":"1.1","name":"Stéphane Chazelas","empty":"","more":"brokendownwith 1 \\ backslash","var1":"a random text","at":"@","var2":"another' random text","var3":"a third random text"}
1
28.07.2021, 11:25

Теги

Похожие вопросы