Slurp
tasks.txt и просмотрите строки, начинающиеся с TODO
, и найдите ближайший D /
, и мы даже можем перепрыгнуть через новые строки, чтобы в этом возникает необходимость. м // с
.
Новая особенность заключается в том, что если бы мы запускали эту вещь во второй раз, то сгенерированные файлы *. Txt
не добавлялись, а запускались заново при каждом запуске. Следовательно, по своей конструкции они никогда не столкнутся с синдромом беглого размера.
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
Как обычно в таких случаях, мы динамически создаем код ed
для получения вывода. Что нового в этом сценарии, так это то, что файл данных, с которым будет работать код ed
, сам динамически генерируется из того же ввода.
Это похоже на то, что данные + код находятся внутри файла data.txt, который разделяется, а затем объединяется в качестве входных данных ed
для генерации вывода из 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.*/\1/;x
G;s/\n/&&/
h
/ *D\/\(.*\)\n\(\(.*\n\)\{0,\}\)\1\n/!{
s/.*[^ ] *D\/\(.*\n\)\n/\1/
x
s/\n\n.*//
s|\(.*[^ ]\) *D/|/\1/w |;s|$|.txt|p;$!d;s/.*/q/p;q
}
g
s/\n\n.*//
s|\(.*[^ ]\) *D/|/\1/W |;s|$|.txt|p;$!d;s/.*/q/p;q
' tasks.txt | ed -s - /tmp/data.txt
Убедитесь, что имя человека, которому назначена задача, не называется «задачи».