Perl
Slurp
tasks.txt e observe as seqüências de caracteres que começam com TODO
e procure o mais próximo D/
, e podemos até pular para as novas linhas, para que surja a necessidade de fazê-lo. m//s
.
Um novo recurso é que, se formos executá-lo uma segunda vez, os arquivos *.txt
gerados não serão anexados, mas começarão novamente em cada rodada. Portanto, por construto, eles nunca enfrentarão a síndrome do tamanho fugitivo.
perl -MFatal=open -l -0777ne '
do{open my $fh, $h{$2}++ ? ">>" : ">", "$2.txt"; print $fh $1 =~ y/\n/ /rs}
while m|\bTODO\s*(.+?)\s*D/(\S+)|sg' tasks.txt
sed + ed
Como é ususal em tais casos, construímos dinamicamente um código ed
para obter a saída. O que o novo recurso neste cenário é que o arquivo de dados em que o código ed
iria operar é gerado dinamicamente a partir da mesma entrada.
Portanto, é como se dados + código fossem encontrados dentro do data.txt, que é separado e depois reunido como entradas de ed
para gerar a saída de ed
.
sed -n '
/TODO/!d
:l
/D\//bw
N
bl
:w
s/.*TODO *//
s/\n/ /g
#<----------------------- ORIG --------------------->#
H;s| *D/.*||w /tmp/data.txt
g;s/.*\n//;x;s/\(.*\)\n.*//;x
G;s/\n/&&/
h
/ *D\/\(.*\)\n\(\(.*\n\)\{0,\}\)\n/!{
s/.*[^ ] *D\/\(.*\n\)\n//
x
s/\n\n.*//
s|\(.*[^ ]\) *D/|//w |;s|$|.txt|p;$!d;s/.*/q/p;q
}
g
s/\n\n.*//
s|\(.*[^ ]\) *D/|//W |;s|$|.txt|p;$!d;s/.*/q/p;q
' tasks.txt | ed -s - /tmp/data.txt
Advertência:
Certifique-se de que nenhum nome de pessoa a quem a tarefa seja atribuída seja chamado de "tarefas".