2017-02-10 5 views
-3

Ich habe einen Ausdruck, der wie folgt aussieht:Zeichenfolge in runden Klammern

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

Ich brauche die endgültige Ausgabe zu sein:

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

Einfach gesagt, wie kann ich jedes ". ersetzen "durch" ^ "beginnend mit dem zweiten Auftreten von" . "in jedem Ausdruck zwischen v();, während der letzte" . "durch" : "in jedem Ausdruck zwischenersetzt wird? Beide v() Ausdrücke erscheinen in derselben Zeile.

Ich habe versucht, die folgenden:

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\:/' 

Dies ergibt folgendes:

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

ich wissen muss, wie man nach, dass ich die ursprüngliche Aussage mit dem modifizierten Text oben ersetzen kann, so dass, wenn endlich wie folgt aussehen wird:

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

ich habe versucht, die folgende

$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'); 

aber es hat nicht funktioniert = (

Irgendwelche Ideen?

+1

Was haben Sie bisher versucht? Bitte [bearbeite] deine Frage, um eine [mcve] einzubeziehen, die das Problem, das du hast, mit dem Code, den du geschrieben hast, aufzeigt. –

+0

In Perl können Sie zum Beispiel versuchen: '$ str = ~ s {(\ w \ (\ w \.) (. *?) \. (\ W \))} {meine ($ erste, $ temp, $ zuletzt) ​​= ($ 1, $ 2, $ 3); $ temp = ~ s /\./^/ g; $ zuerst. $ temp. ':'. $ last} ge' –

+0

Ich habe folgendes versucht: $ ENV {"str"} = "wenn v (a.b.c.d.d.f.g) = v (m.n.o.x.y.z)"; $ str = ~ s {(\ w \ (\ w \.) (. *?) \. (\ W \))} {mein ($ erster, $ temp, $ last) = ($ 1, $ 2, $ 3); $ temp = ~ s /\./^/ g; $ zuerst. $ temp. ':'. $ last} ge; System ('echo $ str'); aber hat nicht funktioniert = ( –

Antwort

0

In den Kommentaren haben Sie gesagt, dass die Zeichenfolge in einer Datei sein sollte. Hier ist ein Beispiel, illustriert diesen Fall:

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; 

Zuerst haben wir den Inhalt der Datei test.txt in den String $str lesen. Dann machen wir den Ersatz. Und schließlich das Ergebnis ausdrucken.

+0

Nehmen Sie an, dass test.txt die folgenden Zeilen enthält: \ n .meas tran trst_write_1a_0000 wenn 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' Anstieg = 1 \ n .mess tran trst_write_1b_0000 wenn 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 'anstieg = 1 \ n Wenn ich Ihr vorgeschlagenes Perl-Skript verwende, werden keine Ersetzungen vorgenommen und die gedruckten Zeilen entsprechen genau der Eingabedatei. –

+0

Hallo Sarah. Ja, aber jetzt enthalten die Parameter zu "v" mehr als einen einzelnen Buchstaben wie in Ihrer ursprünglichen Frage. Zum Beispiel 'v (xsram..' here' xsram' ist fünf Buchstaben nicht ein einzelner Buchstabe wie in Ihrem ursprünglichen Beispiel –

+0

Ich habe meine Antwort aktualisiert, um mit Ihren neuen Spezifikationen umzugehen. Wir verwenden jetzt '\ w +' anstatt nur \ w 'in der Regex –

Verwandte Themen