Solução em TXR :
@(collect)
@name
@ (collect)
@line
@ (last)
@ (end)
@ (maybe)
@ (bind name @[*args* 1])
@ (bind cname @[*args* 2])
@ (bind cline line)
@ (end)
@(end)
@(merge name name cname)
@(merge line line cline)
@(output)
@ (repeat)
@name
@ (repeat)
@line
@ (end)
@ (end)
@(end)
Executar:
$ txr insert.txr data user2 user4
user1
this is only
a test of
a lovely idea
user2
this user shhould
be copied
user3
who has an
idea for
my problem
user4
this user shhould
be copied
Máquina de estado Awk:
BEGIN { split(ed,kv,","); }
1
$0 ~ kv[1] { copy = 1; next }
copy { lines = lines ? lines "\n" $0 : $0 }
/^$/ { if (copy) have = 1; copy = 0; }
END { if (have) { print ""; print kv[2] ; print lines } }
Executar (saída como antes):
$ awk -f insert.awk -v ed=user2,user4 data
user1
this is only
a test of
a lovely idea
user2
this user shhould
be copied
user3
who has an
idea for
my problem
user4
this user shhould
be copied
TXR Awk, lógica equivalente. As linhas são acumuladas em uma estrutura de dados da lista real, em vez de uma string. A lista serve como um booleano, indicando verdadeiro se não estiver vazio, por isso não precisamos do sinalizador have
. Temos acesso direto aos argumentos restantes depois do arquivo de dados.
(awk
(:inputs [*args* 0])
(:let lines copy)
(t)
((equal rec [*args* 1]) (set copy t) (next))
(copy (push rec lines))
((equal rec "") (set copy nil))
(:end (when lines
(put-line) (put-line [*args* 2]) (tprint (nreverse lines)))))
Executar (saída como antes):
$ txr insert.tl data user2 user4