Язык TXR выполняет многострочное сопоставление всего документа, связывает переменные и (с опцией -B
«привязки дампа») выдает правильно экранированные назначения переменных оболочки, которые могут быть eval
-редакторПоддерживаются массивы.
Символ @
является специальным, поэтому его необходимо удвоить, чтобы он соответствовал буквально.
$ cat fields.txr
@(collect)
@@#@@#@@#################################
@ (collect)
@field
@ (until)
@@#@@#@@#
@ (end)
@ (cat field)@# <- catenate the fields together with a space separator by default
@(end)
$ txr -B fields.txr data
field[0]="this is field one"
field[1]="this is field two they can be any number of lines"
$ eval $(txr -B fields.txr data)
$ echo ${field[0]}
this is field one
$ echo ${field[1]}
this is field two they can be any number of lines
Синтаксис @field
соответствует всей строке.Они собраны в список, поскольку он находится внутри @(collect)
, а списки собраны в списки списков, потому что он вложен в другой @(collect)
.Внутренний @(cat field)
, однако, сводит внутренние списки к одной строке, поэтому мы в итоге получаем список строк.
Это «классический TXR»: как он был изначально спроектирован и использован, вызванныйidea:
Почему бы нам не сделать так, чтобы здесь-документы работали задом наперед и не выполняли синтаксический разбор текста из переменных в переменные?
Это неявное выделение совпадающих переменных по умолчанию,в синтаксисе оболочки по умолчанию продолжает оставаться поддерживаемым поведением, даже несмотря на то, что язык стал гораздо более мощным, поэтому меньше необходимости в интеграции со сценариями оболочки.