2017-02-10 57 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 '在正則表達式 –