У меня есть файл с несколькими десятками строк.

Например

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

Мне нужно сохранить дату и скобки вокруг даты в конце каждой строки. Но, как и в первой строке, иногда в других местах используются скобки. Мне нужно заменить эти скобки, например, тире.

Идеальный результат будет:

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

Как я могу сделать это в скрипте bash?

Заранее спасибо.

2
ZPMMaker 23 Фев 2018 в 13:35

4 ответа

Лучший ответ

Простой sed подход:

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

Выход:

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 Фев 2018 в 11:00

Так что это просто быстро и грязно, но вы поняли:

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

Первый sed заменяет левую скобку, если следует буква, следующий sed заменяет скобки, если следует буква.

0
brujoand 23 Фев 2018 в 10:56

Если у вас есть (5 бета-версия), вы можете попробовать этот сед

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

Perl на помощь:

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 Фев 2018 в 10:51