我有一个包含几十行的文件。
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脚本中执行此操作?
提前致谢。
答案 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