The string is made of the following items (also called "actions") separated by spaces. These actions can
be divided in 4 groups:
• navigation: moving up and down the configuration tree.
• list and hash operation: select, add or delete hash or list item (also known as "id" items)
• leaf operation: select, modify or delecte leaf value
• annotation: modify or delete configuration annotation (aka comment)
navigation
- Go up one node
! Go to the root node of the configuration tree.
xxx Go down using "xxx" element. (For "node" type element)
/xxx Go up until the element "xxx" is found. This search can be combined with one of the command
specified below, e.g "/a_string="foo bar""
listandhashoperation
xxx:yy
Go down using "xxx" element and id "yy" (For "hash" or "list" element with "node" cargo_type).
Literal "\n" are replaced by real "\n" (LF in Unix).
xxx:.foreach_match(yy) or xxx:~yy
Go down using "xxx" element and loop over the ids that match the regex specified by "yy". (For
"hash").
For instance, with "OpenSsh" model, you could do
Host:~"/.*.debian.org/" user='foo-guest'
to set "foo-user" users for all your debian accounts.
The leading and trailing '/' may be omitted. Be sure to surround the regexp with double quote if
space are embedded in the regex.
Note that the loop ends when the load command goes above the element where the loop is executed. For
instance, the instruction below tries to execute "DX=BV" and "int_v=9" for all elements of "std_id"
hash:
std_id:~/^\w+$/ DX=Bv int_v=9
In the examples below only "DX=BV" is executed by the loop:
std_id:~/^\w+$/ DX=Bv - int_v=9
std_id:~/^\w+$/ DX=Bv ! int_v=9
The loop is done on all elements of the hash when no value is passed after "":~"" (mnemonic: an empty
regexp matches any value).
xxx:.rm(yy) or xxx:-yy
Delete item referenced by "xxx" element and id "yy". For a list, this is equivalent to "splice
xxx,yy,1". This command does not go down in the tree (since it has just deleted the element). I.e. a
'"-"' is generally not needed afterwards.
xxx:.rm_value(yy) or xxx:-=yy
Remove the element whose value is "yy". For list or hash of leaves. Does not not complain if the
value to delete is not found.
xxx:..rm_match(yy) or xxx:-~/yy/
Remove the element whose value matches "yy". For list or hash of leaves. Does not not complain if no
value were deleted.
xxx:.substitute(/yy/zz/) or xxx:=~s/yy/zz/
Substitute a value with another. Perl switches can be used(e.g. "xxx:=~s/yy/zz/gi")
xxx:<yy or xxx:.push(yy)
Push "yy" value on "xxx" list
xxx:>yy or xxx:.unshift(yy)
Unshift "yy" value on "xxx" list
xxx:@ or xxx:.sort
Sort the list
xxx:.insert_at(yy,zz)
Insert "zz" value on "xxx" list before index "yy".
xxx:.insert_before(yy,zz)
Insert "zz" value on "xxx" list before value "yy".
xxx:.insert_before(/yy/,zz)
Insert "zz" value on "xxx" list before value matching "yy".
xxx:.insort(zz)
Insert "zz" value on "xxx" list so that existing alphanumeric order is preserved.
xxx:.insort(zz)
For hash element containing nodes: creates a new hash element with "zz" key on "xxx" hash so that
existing alphanumeric order of keys is preserved. Note that all keys are sorted once this instruction
is called. Following instructions are applied on the created element. I.e. putting key order aside,
"xxx:.insort(zz)" has the same effect as "xxx:zz" instruction.
xxx:.insort(zz,vv)
For hash element containing leaves: creates a new hash element with "zz" key and assing value "vv" so
that existing alphanumeric order of keys is preserved. Note that all keys are sorted once this
instruction is called. Putting key order aside, "xxx:.insort(zz,vv)" has the same effect as
"xxx:zz=vv" instruction.
xxx:.ensure(zz,...)
Ensure that list "xxx" contains value "zz". If value "zz" is already stored in "xxx" list, this
function does nothing. In the other case, value "zz" is inserted in alphabetical order. This function
accepts a list of values separated by a comma.
xxx:=z1,z2,z3
Set list element "xxx" to list "z1,z2,z3". Use ",," for undef values, and "" for empty values.
I.e, for a list "('a',undef,'','c')", use "a,,"",c".
xxx:yy=zz
For "hash" element containing "leaf" cargo_type. Set the leaf identified by key "yy" to value "zz".
Using "xxx:~/yy/=zz" is also possible.
xxx:.copy(yy,zz)
copy item "yy" in "zz" (hash or list).
xxx:.rename(yy,zz)
rename item "yy" in "zz" (hash).
xxx:.move(yy,zz)
Alias to rename.
xxx:.json("path/to/file.json/foo/bar")
Store "bar" content in array or hash. This should be used to store hash or list of values.
You may store deep data structure. In this case, make sure that the structure of the loaded data
matches the structure of the model. This won't happen by chance.
xxx:.clear
Clear the hash or list.
leafoperation
xxx=zz
Set element "xxx" to value "yy". load also accepts to set elements with a quoted string. (For "leaf"
element) Literal "\n" are replaced by real "\n" (LF in Unix). Literal "\\" are replaced by "\".
For instance "foo="a quoted string"" or "foo="\"bar\" and \"baz\""".
xxx=~s/foo/bar/
Apply the substitution to the value of xxx. "s/foo/bar/" is the standard Perl "s" substitution
pattern.
Patterns with white spaces must be surrounded by quotes:
xxx=~"s/foo bar/bar baz/"
Perl pattern modifiers are accepted
xxx=~s/FOO/bar/i
xxx~
Undef element "xxx"
xxx.=zzz
Appends "zzz" value to current value (valid for "leaf" elements).
xxx=.set_to_standard_value()
Set to standard value. Standard value is like a suggested value which requires an action from user to
be set. "set_to_std_value" is also accepted.
xxx=.file(yyy)
Store the content of file "yyy" in element "xxx".
Store STDIn in value xxx when "yyy" is '-'.
xxx=.json(path/to/data.json/foo/bar)
Open file "data.json" and store value from JSON data extracted with "foo/bar" subpath.
For instance, if "data.json" contains:
{
"foo": {
"bar": 42
}
}
The instruction "baz=.json(data.json/foo/bar)" stores 42 in "baz" element.
xxx=.yaml(path/to/data.yaml/0/foo/bar)
Open file "data.yaml" and store value from YAML data extracted with "0/foo/bar" subpath.
Since a YAML file can contain several documents (separated by "---" lines, the subpath must begin
with a number to select the document containing the required value.
For instance, if "data.yaml" contains:
---
foo:
bar: 42
The instruction "baz=.yaml(data.yaml/0/foo/bar)" stores 42 in "baz" element.
xxx=.env(yyy)
Store the content of environment variable "yyy" in element "xxx".
annotation
xxx#zzz or xxx:yyy#zzz
Element annotation. Can be quoted or not quoted. Note that annotations are always placed at the end
of an action item.
I.e. "foo#comment", "foo:bar#comment" or "foo:bar=baz#comment" are valid. "foo#comment:bar" is not
valid.
Quotes
You can surround indexes and values with single or double quotes. E.g.:
a_string='"foo" and "bar"'
Single quotes were added in version 2.153.