Você também pode fazer isso:
a) Este é o código POSIX-sed
compatível, no qual armazenamos as linhas intermediárias (! / foo / e! / bar /) na área de espera.
sed -e '
/foo/,/bar/!d
/foo/d
/bar/!{H;$!d;}
s/.*//;x;s/^\n//;y/\n/ /
' input-file.txt
b) e com Perl
como mostrado
perl -lne '
next unless /foo/ ... /bar/;
push(@A, $_),next if !/foo/ && !/bar/ && !eof;
push(@A, $_) if !/foo/ && !/bar/ && eof;
print join " ", splice @A if /bar/ || !/foo/ && eof;
' input-file.txt
Explicação:
- pule linhas ou linhas não interessantes que estão fora do intervalo. Um intervalo é definido como começando com uma linha contendo
/foo/
e terminando com /bar/
, ambos ocorrendo em linhas separadas.
- Quando estivermos no intervalo, executemos ações separadas com base na linha em que estamos.
- Para linhas que não são / foo /, nem / bar / e nem eof: armazenam a linha na matriz
@A
. Depois de armazenar, volte para ler o próximo registro, desde que não exista.
- Apenas para o fim do intervalo, ou seja,
/bar/
ou eof
, tomamos a ação de imprimir o que está em @A
e também o esvaziamos, em preparação para o próximo ciclo de coleta.