fix sub (#586); add gsub/3; add transpose/0.
Signed-off-by: William Langford <wlangfor@gmail.com>
This commit is contained in:
1 parent
1796a716ea
commit
85f0e30c81
3 files changed
+38
-9
No files matched your search
@@ -1051,17 +1051,19 @@ static const char* const jq_builtins[] = {
|
||||
"def sub($re; s):"
|
||||
" . as $in"
|
||||
" | [match($re)]"
|
||||
" | .[0]"
|
||||
" | . as $r"
|
||||
// # create the \"capture\" object:
|
||||
" | reduce ( $r | .captures | .[] | select(.name != null) | { (.name) : .string } ) as $pair"
|
||||
" ({}; . + $pair)"
|
||||
" | if . == {} then $in | .[0:$r.offset]+s+.[$r.offset+$r.length:]"
|
||||
" else (. | s)"
|
||||
" | if length == 0 then $in"
|
||||
" else .[0]"
|
||||
" | . as $r"
|
||||
// # create the \"capture\" object:
|
||||
" | reduce ( $r | .captures | .[] | select(.name != null) | { (.name) : .string } ) as $pair"
|
||||
" ({}; . + $pair)"
|
||||
" | if . == {} then $in | .[0:$r.offset]+s+.[$r.offset+$r.length:]"
|
||||
" else (. | s)"
|
||||
" end"
|
||||
" end ;",
|
||||
//
|
||||
// repeated substitution of re (which may contain named captures)
|
||||
"def gsub($re; s):"
|
||||
"def gsub($re; s; flags):"
|
||||
// # _stredit(edits;s) - s is the \"to\" string, which might contain capture variables,
|
||||
// # so if an edit contains captures, then create the capture object and pipe it to s
|
||||
" def _stredit(edits; s):"
|
||||
@@ -1076,7 +1078,8 @@ static const char* const jq_builtins[] = {
|
||||
" else (if $l == 0 then \"\" else ($in | _stredit(edits[0:$l]; s)) end) + (. | s)"
|
||||
" end"
|
||||
" end ;"
|
||||
" [match($re;\"g\")] as $edits | _stredit($edits; s) ;",
|
||||
" [match($re; flags + \"g\")] as $edits | _stredit($edits; s) ;",
|
||||
"def gsub($re; s): gsub($re; s; \"\");"
|
||||
|
||||
//#######################################################################
|
||||
// range/3, with a `by` expression argument
|
||||
@@ -1096,6 +1099,16 @@ static const char* const jq_builtins[] = {
|
||||
"def first: .[0];",
|
||||
"def last: .[-1];",
|
||||
"def nth($n): .[$n];",
|
||||
// # transpose a possibly jagged matrix, quickly;
|
||||
// # rows are padded with nulls so the result is always rectangular.
|
||||
"def transpose:"
|
||||
" if . == [] then []"
|
||||
" else . as $in"
|
||||
" | (map(length) | max) as $max"
|
||||
" | length as $length"
|
||||
" | reduce range(0; $max) as $j"
|
||||
" ([]; . + [reduce range(0;$length) as $i ([]; . + [ $in[$i][$j] ] )] )"
|
||||
" end;",
|
||||
};
|
||||
#undef LIBM_DD
|
||||
|
||||
|
||||
@@ -1341,6 +1341,18 @@ sections:
|
||||
input: 'null'
|
||||
output: ['"less"']
|
||||
|
||||
- title: "`transpose`"
|
||||
body: |
|
||||
|
||||
Transpose a possibly jagged matrix (an array of arrays).
|
||||
Rows are padded with nulls so the result is always rectangular.
|
||||
|
||||
examples:
|
||||
- program: 'target'
|
||||
input: '[[1], [2,3]]'
|
||||
output: ['[1,2],[null,3]']
|
||||
|
||||
|
||||
- title: "String interpolation - `\\(foo)`"
|
||||
body: |
|
||||
|
||||
|
||||
@@ -1094,3 +1094,7 @@ flatten(2)
|
||||
flatten(2)
|
||||
[0, [1, [2]], [1, [[3], 2]]]
|
||||
[0, 1, 2, 1, [3], 2]
|
||||
|
||||
transpose
|
||||
[[1], [2,3]]
|
||||
[[1,2],[null,3]]
|
||||
Reference in new issue
Block a user