stred

Stred: Streaming Tree Editor. Like sed but for JSON
git clone http://shtanton.xyz/git/repo/stred
Log | Files | Refs

commit a4015bc64d5174f62bc2d150c6a780b89c00a0cc
parent a55375e36b159448723807198cd2b2bbd4371c1f
Author: Charlie Stanton <charlie@shtanton.xyz>
Date:   Fri, 21 Apr 2023 10:42:03 +0100

Add a and A commands for global substitution

Diffstat:
Mmain/lex.go | 2+-
Mmain/parse.go | 14+++++++++++---
2 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/main/lex.go b/main/lex.go @@ -179,7 +179,7 @@ func lexCommand(l *lexer) stateFunc { case '}': l.emit(TokenRBrace) return lexCommand - case 's', 'S', 'f', 'F', 'l', 'L': + case 's', 'S', 'f', 'F', 'l', 'L', 'a', 'A': l.emit(TokenCommand) return lexSubstitution } diff --git a/main/parse.go b/main/parse.go @@ -69,7 +69,7 @@ func (p *parser) parseBasicCommand(commandChar rune) Command { return NextCommand{} case 'N': return AppendNextCommand{} - case 's', 'S', 'f', 'F', 'l', 'L': + case 's', 'S', 'f', 'F', 'l', 'L', 'a', 'A': ast := p.parseSubex() switch commandChar { case 'f': @@ -110,6 +110,14 @@ func (p *parser) parseBasicCommand(commandChar rune) Command { Match: ast, }, } + case 'a', 'A': + ast = subex.SubexASTRepeat { + Acceptable: []subex.ConvexRange{{Start: -1, End: 0}}, + Content: subex.SubexASTOr { + First: ast, + Second: subex.SubexASTCopyAny{}, + }, + } } subex := subex.CompileTransducer(ast) var next Command @@ -121,9 +129,9 @@ func (p *parser) parseBasicCommand(commandChar rune) Command { next = p.parseCommand() } switch commandChar { - case 's': + case 's', 'a': return SubstituteValueCommand {subex, next} - case 'S', 'f', 'F', 'l', 'L': + case 'S', 'f', 'F', 'l', 'L', 'A': return SubstitutePathCommand {subex, next} default: panic("Unreachable!?!?")