С 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"}