我的表达式如下:
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' );
但它不起作用=(
有什么想法吗?
答案 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
。然后我们做替换。最后打印结果。