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.)