substitui um padrão encontrado por um número mais 1 na mesma linha

2

Eu tenho um arquivo onde cada linha contém uma palavra-chave ( HELLO ) e um ou mais campos numéricos designados A1 , A2 , etc. O valor no campo numérico é colocado entre colchetes após o nome do campo e é opcional; se não estiver presente, o padrão é 0 . Cada campo pode conter vários números separados por : ; Eu só me importo com o primeiro. Eu preciso substituir a palavra-chave ( HELLO ) por 'A1 [X-Y + 1]. Aqui está um exemplo rápido:

case1: my test is (HELLO) with some numbers (A1, A2, A3, A4)
case2: my test is (HELLO) with some numbers (A1[X:Y], A2, A3, A4)
case3: replaceit(something(HELLO)) sometext (single_bit_here, somedatahere[4], something, something,something,something) ;

No primeiro, o campo A1 não recebe um valor, então 0 é assumido. 0 + 1 = 1 , então a saída é 1 .

No segundo caso, A1 tem um intervalo X: Y , então o resultado é X-Y + 1 . Vamos ter X = 10 e Y = 3 . Então, " HELLO " será 10-3 + 1 = 8 .

Saída:

case1: my test is (1) with some numbers (A1, A2, A3, A4)
case2: my test is (X-Y+1) with some numbers (A1[X:Y], A2, A3, A4)
case3: replaceit(something(1)) sometext (single_bit_here, somedatahere[4], something, something,something,something) ;

O código foi modificado um pouco e funcionou para todas as situações.

awk 'BEGIN {FS="[[\]]"}
{
nFields=split($2,a,":")
if(nFields ==2) n=1+a[1]-a[2]
else n=1
gsub("data_width", n) } 1' <datain.txt

o seguinte na pergunta: Eu preciso fazer a mesma substituição "inline" para todos os arquivos no mesmo diretório, por isso não preciso salvar os arquivos. Gostaria de usar o script perl sugerido abaixo.

    
por user3342338 02.03.2014 / 23:01

1 resposta

2

Os dados do teste:

$ cat data
case1: my test is (HELLO) with some numbers (A1, A2, A3, A4)
case2: my test is (HELLO) with some numbers (A1[10:3], A2, A3, A4)
case3: replaceit(something(HELLO)) sometext (single_bit_here, somedatahere[4], something, something,something,something) ;

O script Perl:

#!/usr/bin/perl
use strict;
use warnings;

while (<>) {
    my $n = 1;
    $n = 1 + $1 - $2 if (/\([^\,)]*\[(\d+)(?::(\d+))?[^\)]*\)[^\)]*$/);
    s/HELLO/$n/;
    print;
}

A saída:

$ ./the-script.pl < data
case1: my test is (1) with some numbers (A1, A2, A3, A4)
case2: my test is (8) with some numbers (A1[10:3], A2, A3, A4)
case3: replaceit(something(1)) sometext (single_bit_here, somedatahere[4], something, something,something,something) ;
    
por 02.03.2014 / 23:41