2017-02-10 56 views
-3

我有一个看起来像这样的表达式:在更换圆括号之间串

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) 

简单地说,我怎么可以相互替换“. “在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

你到目前为止尝试过什么?请[编辑]您的问题,以包含[mcve],以证明您使用您编写的代码所遇到的问题。 –

+0

在Perl中,你可以尝试例如:'$ str =〜s {(\ w \(\ w \。)(。*?)\。(\ w \))} {my($ first,$ temp,$最后)=($ 1,$ 2,$ 3); $ temp =〜s /\./^/ g; $优先。 $ temp。 ':'。 $ last} ge' –

+0

我尝试了以下方法:$ vb {“str”} =“当v(a.b.c.d.e.f.g)= v(m.n.o.x.y.z)”; ($ first,$ temp,$ last)=($ 1,$ 2,$ 3)$ str =〜s {(\ w \(\ w \。)(。*?)\。(\ w \)) ); $ temp =〜s /\./^/ g; $优先。 $ temp。 ':'。 $最后} GE; system('echo $ str');但是没有工作=( –

回答

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。然后我们做替换。最后打印结果。

+0

假设的test.txt包含以下行:吗?\ n .meas TRAN trst_write_1a_0000时v(xsram.xcore_0right_b0.xcore_d0_bl0_3_wl0_3.xcore_bl0_1_wl0_1.mn11.g)= '0.2 * supply_mem' TD = '4 * TP' 上升= 1 \ n .meas TRAN trst_write_1b_0000当v(xsram.xgio0_right.xgio_bit2.xldp.xprech_wd.m0_1_1.d)='V(xsram.xgio0_right.xgio_bit2.xldp.xprech_wd.m1_1_1。d)-0.010'td ='trst_write_1a_0000'rise = 1 \ n 当我使用您建议的perl脚本时,不会进行替换,并且打印的行与输入文件完全相同。 –

+0

嗨Sarah。是的,但现在“v”的参数包含多于一个字母,就像您在原始问题中所做的那样。例如'v(xsram..'这里'xsram'是五个字母不是单个字母,就像您在原始示例中一样 –

+0

我已经更新了我的答案来处理您的新规范。现在我们使用'\ w +'而不是'\ w '在正则表达式 –