fix sub (#586); add gsub/3; add transpose/0.

Signed-off-by: William Langford <wlangfor@gmail.com>
This commit is contained in:
pkoppstein authored and William Langford committed 2014-10-06 21:32:07 -04:00
1 parent 1796a716ea
commit 85f0e30c81
3 files changed
+38 -9

No files matched your search

+22 -9
View File
@@ -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
+12
View File
@@ -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: |
+4
View File
@@ -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]]