在圆括号之间替换字符串

时间:2017-02-10 22:56:20

标签: python regex bash perl shell

我的表达式如下:

when v(a.b.c.d.e.f.g) = v(m.n.o.x.y.z)

我需要最终输出:

when v(a.b^c^d^e^f:g) = v(m.n^o^x^y:z)

简单地说,我怎样才能更换每个" ." by" ^"从第二次出现" ."在v();之间的每个表达式中,同时替换最后一个" ."用" :"在v()之间的每个表达式?两个v()表达式都出现在同一行。

我尝试了以下内容:

setenv test "when v(a.b.c.d.e.f.g) = v(m.n.o.x.y.z)"

echo $test | awk -F"(" '{for(i=2;i<=NF;i++){if($i~/\)/){sub(").*","",$i)};print $i}}' | \
    sed -E 's/\./\^/g2' | sed 's/\(.*\)\^/\1\:/'

这给出了以下内容:

a.b^c^d^e^f:g
m.n^o^x^y:z

我需要知道在此之后我可以用上面的修改过的文本替换原始语句,以便最终看起来像这样:

when v(a.b^c^d^e^f:g) = v(m.n^o^x^y:z)

我尝试了以下

$ENV{"str"} = "when v(a.b.c.d.e.f.g) = v(m.n.o.x.y.z)";

$str =~ s{(\w(\w\.)(.*?)\.(\w))}{
    my ( $first, $temp, $last) = ( $1, $2, $3 );
    $temp =~ s/\./^/g;
    $first . $temp . ':' . $last
}ge;

system( 'echo $str' );

但它不起作用=(

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

在评论中,你说字符串应该在一个文件中。 这是一个例子,说明了这种情况:

use strict;
use warnings;

my $file_name = 'test.txt';

open ( my $fh, '<', $file_name ) or die "Could not open file '$file_name': $!";

my $str = do { local $/; <$fh> };
close $fh;

$str =~ s{(\w\(\w+\.)(.*?)\.(\w+\))}{
  my ( $first, $temp, $last) = ( $1, $2, $3);
  $temp =~ s/\./^/g;
  $first . $temp . ':' . $last}ge;

print $str;

首先,我们将文件test.txt的内容读入字符串$str。然后我们做替换。最后打印结果。