Tengo un archivo con unas pocas docenas de líneas.

E.g.

Vector volume solid option displays (beta version) added to OpenGL Volume (2/22/18).
Up to 6 unique sitemap bitmap option added to the OpenGL Volume display (2/19/18).
Import of Vector-xyza.dat file min/max values on location adjusted to the lower and upper integral values (2/19/18).

Necesito retener la fecha y los corchetes alrededor de la fecha al final de cada línea. Pero, como en la primera línea, a veces los corchetes se usan en otros lugares. Necesito reemplazar esos soportes con p. Ej. un guión.

El resultado ideal sería:

Vector volume solid option displays -beta version- added to OpenGL Volume (2/22/18).
Up to 6 unique sitemap bitmap option added to the OpenGL Volume display (2/19/18).
Import of Vector-xyza.dat file min/max values on location adjusted to the lower and upper integral values (2/19/18).

¿Cómo puedo hacer esto en un script bash?

Gracias de antemano.

2
ZPMMaker 23 feb. 2018 a las 13:35

4 respuestas

La mejor respuesta

Enfoque simple sed :

sed -E 's/\(([^0-9()]+[^()]+)\)/-\1-/g' file

La salida:

Vector volume solid option displays -beta version- added to OpenGL Volume (2/22/18).
Up to 6 unique sitemap bitmap option added to the OpenGL Volume display (2/19/18).
Import of Vector-xyza.dat file min/max values on location adjusted to the lower and upper integral values (2/19/18).
4
RomanPerekhrest 23 feb. 2018 a las 11:00

Así que esto es rápido y sucio, pero te haces una idea:

echo 'Vector volume solid option displays (beta version) added to OpenGL Volume (2/22/18).' | sed -En 's/\(([a-zA-Z])/-\1/p' | sed -nE 's/([a-zA-Z])\)/\1-/p'
Vector volume solid option displays -beta version- added to OpenGL Volume (2/22/18).

Primero sed reemplaza el corchete izquierdo si va seguido de una letra, luego sed reemplaza los corchetes si sigue una letra.

0
brujoand 23 feb. 2018 a las 10:56

Si tienes (versión 5 beta), puedes probar este sed

sed -E ':A;s/([^(]*)(\()([^)]*)(\))([^(]*)(\([^)]*\).*)/\1-\3-\5\6/;tA' infile
0
ctac_ 23 feb. 2018 a las 16:16

Perl al rescate:

perl -pe '
    $l = tr/(//; $r = tr/)//;
    die "Different number of left ($l) and right ($r) brackets.\n"
        if $l != $r;
    s/\(/-/,s/\)/-/ while --$l;
' -- file
0
choroba 23 feb. 2018 a las 10:51