Tenho certeza de que há muitas respostas interessantes usando awk
, perl
, sed
e outros. Aqui está uma opção bastante simplista que usa tr
para transformar este problema de volta em um problema que sabemos como resolver - encontrar um padrão dentro de uma linha:
$ tr 'C' '\n' <test.file | sed -n 's/.*A\(.*\)B\(.*$\)/ /p'
O comando tr 'C' '\n'
traduz qualquer "C" na entrada em um caractere de nova linha. Assim, é necessário apenas canalizá-lo para um comando que produzirá o texto entre A e B e entre B e o fim da linha.
Se A, B e C forem expressões regulares em vez de caracteres simples, tente:
sed -e 's/C/\n/g' < test.file | sed -n 's/.*A\(.*\)B\(.*\)/ /p'
Isso usa a mesma ideia básica, mas usa sed
para criar as novas linhas.