The GNU sed manual offers the following to join backslash-continued lines:
sed -e ':x /\$/ { N; s/\\\n//g ; bx }' FILE.txt
To demonstrate,
this \
is \
a \
long \
line
and another \
line
is formatted as:
this is a long line
and another line
We can achieve this in Jacinda by folding
fn go(acc, line) :=
option (acc+'\n'+line) [x+line] (acc ~* 1 /([^\\]*)\\/);
go|>$0
This is much more direct and easier to follow than the sed, despite its prolixity. However, it builds up a whole string rather than streaming; the whole output is stored in memory rather than one output line at a time.
To stream, we can use a scan and :?
(mapMaybe
), viz.
@include'prelude/fn.jac'
fn go(acc, line) :=
let
val accStr := fromMaybe '' (acc->1)
in
option (None . Some (accStr+line)) [(Some (accStr+x) . None)] (line ~* 1 /([^\\]*)\\/)
end;
[x->2]:?(go^(None.None) $0)
The lack of pattern-matching on tuples in Jacinda is unsatisfying.
As a parting shot, AWK:
awk 'BEGIN {RS=/[^\\]\n/} { gsub(/\\\n/, "", $0); print }' FILE.txt | head -n'-1'