Метод 1
Изменение ввода с помощью tac
, как предлагает Sundeep, значительно облегчает эту проблему:
tac data.txt | sed '/^----*$/ {N;a\
}' | tac | sed '2,$p'
Метод 2
Это сложная проблема, связанная только с sed (по крайней мере, для меня). Я был близко, но выбрал Perl. sed завершается, так что это определенно можно перевести. Интуитивно я бы сказал, что это может быть выполнено с помощью одного дополнительного строкового буфера, и я надеюсь, что кто-то ответит с помощью реализации только для sed. Были времена, когда это просто не держалось. Было так много странных случаев, что я решил поставить в очередь весь путь:
my @queue = ();
while (<>) {
if (/----*/) {
do {
print $queue[0];
print "\n" if scalar @queue == 2;
shift @queue;
} while (scalar @queue);
print;
} else {
push @queue, $_;
}
}
do print shift @queue while scalar @queue;
Я начал смотреть на проблему как:
1
0
2
1
0
Числа представляют собой смещения из следующей строки ---*
, где 0
- строка ----*
. Если смещение равно 2
, выведите новую строку.
Постановка задачи четко выражена как:
print \n before previous line if line ~ /----*/
.
Как бы то ни было, вот вывод вызова & thinsp; / & thinsp;
$ perl script.pl data.txt
tbl
---
tmp1
col1|col2
---------
22| 33
32| 45
tbl
---
tmp2
col1|col2| col3
---------------
22| 33| 123
32| 45| 456