summaryrefslogtreecommitdiffstats
path: root/builtin.c
diff options
context:
space:
mode:
Diffstat (limited to 'builtin.c')
-rw-r--r--builtin.c31
1 files changed, 22 insertions, 9 deletions
diff --git a/builtin.c b/builtin.c
index 6f668942..7ca0f817 100644
--- a/builtin.c
+++ b/builtin.c
@@ -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