2017-02-10 7 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()? Оба выражения 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, $ last) = ($ 1, $ 2, $ 3); $ temp = ~ s /\./^/ g; $ сначала. $ temp. ':'. $ last} ge' –

+0

Я пробовал следующее: $ ENV {"str"} = "когда 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; $ сначала. $ temp. ':'. $ Последний} GE; система ('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 when 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' rise = 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

Привет, Сара. Да, но теперь параметры 'v' содержат более одной буквы, как в исходном вопросе. Например, 'v (xsram..' здесь' xsram' - это пять букв не одна буква, как в вашем исходном примере –

+0

Я обновил свой ответ для обработки ваших новых спецификаций. Теперь мы используем '\ w +' вместо просто '\ w 'в regex –

 Смежные вопросы

  • Нет связанных вопросов^_^