replace un patrón encontrado con un número más 1 en la misma línea

Tengo un file donde cada línea contiene una palabra key ( HELLO ) y uno o más campos numéricos designados como A1 , A2 , etc. El valor en el campo numérico está entre corchetes después del nombre del campo y es opcional; si no está presente, su valor pnetworkingeterminado es 0 . Cada campo puede contener varios numbers separados por:; Solo me importa el primero. Necesito replace la palabra key ( HELLO ) con `A1 [X-Y + 1]. Aquí hay un ejemplo 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) ; 

En el primero, el campo A1 no recibe un valor, por lo que se asume 0 . 0 + 1 = 1 , por lo que la salida es 1 .

En el segundo caso, A1 tiene un range X: Y , por lo que el resultado es X-Y + 1 . Tengamos X = 10 e Y = 3 . Entonces " HOLA " se convertirá en 10-3 + 1 = 8 .

Salida:

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

El código fue modificado un poco y funcionó para todas las situaciones.

 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 

la siguiente pregunta: Necesito hacer el mismo reemploop "en línea" para todos los files en el mismo directory, así que no necesito save los files. Me gustaría utilizar el script perl sugerido a continuación.

Los datos de testing:

 $ 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) ; 

El script de Perl:

 #!/usr/bin/perl use strict; use warnings; while (<>) { my $n = 1; $n = 1 + $1 - $2 if (/\([^\,)]*\[(\d+)(?::(\d+))?[^\)]*\)[^\)]*$/); s/HELLO/$n/; print; } 

La salida:

 $ ./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) ;