Embora você possa fazer isso com o AWK, sugiro Perl. Aqui está um script:
#!/usr/bin/env perl
use strict;
use warnings;
while (my $pattern = <>) {
my $text = <>;
my $start = index $pattern, 'A';
my $stop = index $pattern, 'B', $start;
print substr($text, $start, $stop - $start + 1), "\n";
}
Você pode nomear esse arquivo de script como quiser. Se você fosse nomear interval e colocar no diretório atual, você pode marcá-lo como executável com chmod +x interval . Então você pode correr:
./interval paths...
Substitua paths... pelo nome de caminho ou nome de caminho reais pelos arquivos que você deseja analisar. Por exemplo:
$ ./interval interval-example.txt
7890MNOP
34567890MNOPQRST
A maneira como o script funciona é que, até o final da entrada ser alcançado (ou seja, sem mais linhas), ele:
- Lê uma linha,
$pattern , que é sua string com A e B , e outra linha, $text , que é a string que será fatiada.
- Localiza o índice do primeiro
A em $pattern e o primeiro B além de qualquer um que tenha precedido esse primeiro A e os armazena nas variáveis $start e $stop , respectivamente .
- Executa apenas a parte de
$text cujos índices variam de $start a $stop . A função substr de Perl usa argumentos de deslocamento e comprimento, que é o motivo da subtração, e você inclui a letra imediatamente abaixo de B , que é a razão para adicionar 1 .
- Imprime apenas essa parte, seguida por uma quebra de linha.
Se por algum motivo você preferir um comando curto de uma linha que atinja a mesma coisa, mas seja facilmente colado - mas também seja mais difícil de entender e manter - então você pode usar isso:
perl -wple '$i=index $_,"A"; $_=substr <>,$i,index($_,"B",$i)-$i+1' paths...
(Como antes, você precisa substituir paths... pelos nomes dos caminhos reais.)