如何在Bash

时间:2018-02-23 10:35:59

标签: bash awk sed character

我有一个包含几十行的文件。

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

我需要在每行末尾的日期周围保留日期和括号。但是,与第一行一样,有时在其他地方使用括号。我需要用例如替换那些括号。破折号。

理想的输出是:

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脚本中执行此操作?

提前致谢。

4 个答案:

答案 0 :(得分: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).

答案 1 :(得分:0)

所以这只是快速和肮脏,但你明白了:

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替换括号。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

如果你有(5 beta版),你可以试试这个sed

sed -E ':A;s/([^(]*)(\()([^)]*)(\))([^(]*)(\([^)]*\).*)/\1-\3-\5\6/;tA' infile