2017-04-18 14 views
1

Ich muss nach einem langen Wort suchen und dann die Zahlen vor bekommen.Suche rückwärts Wort in Zeile

Ich werde erklären: Wenn ich diese Zeile haben:

208.86 Mhz cr_st|altpll_component|clk[0] 

Ich brauche die Zeichenfolge cr_st|altpll_component|clk[0], finden dann 208.86 Mhz mit der Zeichenfolge Ich muss einige Variable gesetzt.

Ich habe versucht, so mit Suche nach der Zeichenfolge

set timing_file [open $link/temp_st.sta.rpt] 
while {[gets $timing_file line] != -1} { 
incr line_num 
if {[regexp {cr_st|altpll_component|clk[0]\s+(.*)} $line all FEC_CLK]} { 
    puts $line_num 
} 
} 
close $timing_file 
+0

Was ist Ihre Frage? Was erwartest du und was passiert stattdessen? – mkrieger1

Antwort

0

Alles, was Sie tun müssen, ist ein bestimmtes Muster zu verwenden, um eine Zahl und ein Wort vor einem bestimmten „hart codiert“ string zu extrahieren.

eine Erfassungsgruppe um das Musterteil Verwenden Sie und

set a {208.86 Mhz cr_st|altpll_component|clk[0]} 
regexp {(\d[\d.]*\s*\w+)\s+cr_st\|altpll_component\|clk\[0]} $a - result 
puts $result 

die Tcl demo nachschauen zu extrahieren. Wenn Sie den Nummernvergleich genauer machen müssen, können Sie \d+(?:\.\d+)? verwenden. Siehe die Erläuterungen unter:

  • (\d[\d.]*\s*\w+) - Capture-Gruppe 1:
    • \d[\d.]* - eine Ziffer (\d), gefolgt mit 0+ Ziffern oder Punkte (als Alternative, können Sie verwenden \d+(?:\.\d+)?: 1+ Ziffern (\d+) und anschließend mit 1 oder 0 Vorkommen (dh optional) von einem Punkt und 1+ digits)
    • \s* - 0+ Leerzeichen
    • \w+ - 1 oder mehr Wort Zeichen (Buchstaben/Ziffern/_)
  • \s+ - 1+ Leerzeichen Symbole
  • cr_st\|altpll_component\|clk\[0] - eine Zeichenkette cr_st|altpll_component|clk[0] (man beachte die | und [ müssen entwertet werden als wörtliche Zeichen behandelt werden, sonst werden sie als regex Operatoren analysiert)

Notiere die - result in der regexp Linie: - für ein ganzes Spiel steht (und da wir nicht interessiert sind, - ist in Ordnung) und result wird den Wert der ersten (und einzigen) einfangenden Gruppe enthalten.

1

Ich schlage vor, Sie verwenden scan, um den Wert und die Einheit zu erhalten. Stellen Sie sicher, dass Sie beide erhalten.

if {[regexp {cr_st|altpll_component|clk[0]\s+(.*)} $line all FEC_CLK]} { 
    # new code 
    if {[scan $line {%f %s} value unit] == 2} { 
     set some_variable "$value $unit" 
    } 
    # end new code 
    puts $line_num 
} 

Dokumentation: scan

Verwandte Themen