替换不同文件中的字符串

时间:2013-10-25 09:00:49

标签: replace tcl

以下是内存目录

每个目录都需要输入并修改以下三个文件:

  1. hcell.list
  2. SmicDR1T_cal40_log_ll_sali_p1mx_1tm_121825.drc
  3. SmicSP1R_cal40_LL_sali_p1mtx_11182533.lvs
  4. 以上三个文件的内容为“TPSRAM_256X120”,我想用自己的目录路径名替换它。

    我该怎么做?

     SPRF_256X34      SPSRAM_128X30    SPSRAM_192X16   SPSRAM_240X48  SPSRAM_2944X72  SPSRAM_480X48  SPSRAM_512X8    SPSRAM_72X8     SPSRAM_960X60_WEM  SROM_8192X8
     command.log      SPSRAM_1024X14   SPSRAM_128X64    SPSRAM_2048X17  SPSRAM_240X56  SPSRAM_304X128  SPSRAM_480X64  SPSRAM_5376X17  SPSRAM_8192X12  SPSRAM_960X8       SROM_960X26
    filenames.log    SPSRAM_1024X16   SPSRAM_152X8     SPSRAM_2048X8   SPSRAM_240X72  SPSRAM_32X64    SPSRAM_480X66  SPSRAM_5376X80  SPSRAM_8192X20  SPSRAM_960X80      TPSRAM_1920X9
     mem_new.list     SPSRAM_11520X28  SPSRAM_16384X34  SPSRAM_240X10   SPSRAM_240X8   SPSRAM_384X19   SPSRAM_480X96  SPSRAM_544X20   SPSRAM_8192X34  SPSRAM_960X96      TPSRAM_256X120
    SPRF_240X20      SPSRAM_120X72    SPSRAM_16384X38  SPSRAM_240X152  SPSRAM_240X88  SPSRAM_4352X8   SPSRAM_496X44  SPSRAM_544X21   SPSRAM_8192X52  SROM_1024X16
     SPRF_240X32      SPSRAM_120X80    SPSRAM_16384X40  SPSRAM_240X17   SPSRAM_240X9   SPSRAM_4480X8   SPSRAM_496X82  SPSRAM_5760X32  SPSRAM_8192X72  SROM_1440X14
    SPRF_240X82      SPSRAM_120X88    SPSRAM_1920X56   SPSRAM_240X18   SPSRAM_240X96  SPSRAM_480X128  SPSRAM_496X86  SPSRAM_64X22    SPSRAM_8192X8   SROM_1888X26
     SPRF_240X86      SPSRAM_1216X40   SPSRAM_1920X60   SPSRAM_240X22   SPSRAM_256X8   SPSRAM_480X144  SPSRAM_512X10  SPSRAM_64X24    SPSRAM_8192X9   SROM_4096X8
    SPRF_240X86_WEM  SPSRAM_1280X32   SPSRAM_1920X8    SPSRAM_240X34   SPSRAM_2688X8  SPSRAM_480X16   SPSRAM_512X17  SPSRAM_64X48    SPSRAM_960X24   SROM_512X16
     SPRF_240X90      SPSRAM_128X16    SPSRAM_1920X9    SPSRAM_240X40   SPSRAM_2880X8  SPSRAM_480X32   SPSRAM_512X27  SPSRAM_720X12   SPSRAM_960X60   SROM_736X14
    

2 个答案:

答案 0 :(得分:0)

获取所有目录:

set all_dir [glob -type d -nocomplain -dir $dirname *]
在foreach循环中

打开你的文件:hcell.list,SmicDR1T_cal40_log_ll_sali_p1mx_1tm_121825.drc,SmicSP1R_cal40_LL_sali_p1mtx_11182533.lvs

set r [open [file join $dir hcell.list] r]

现在使用regsub替换您的内容:

regsub "TPSRAM_256X120" $line [pwd]

答案 1 :(得分:0)

要将文件中的值替换为另一个文件,同时将该文件写回同一文件,您需要这样的代码:

proc replaceValue {filename changeThis toThis {backupExtension ""}} {
    set mapping [list $changeThis $toThis]

    # Read and transform the file
    set f [open $filename]
    set content [string map $mapping [read $f]]
    close $f

    # Make backup if requested
    if {$backupExtension ne ""} {
        file rename $filename $filename$backupExtension
    }

    # Write the new contents back
    set f [open $filename "w"]
    puts -nonewline $f $content
    close $f
}

这仅适用于高达几百兆字节的文件(假设您有足够的内存),但它简单

然后,要将更改应用于目录中的所有内容,请使用glob列出目录内容,使用foreach查看列表,以及应用转换的过程。

# Glob patterns in quotes just because of Markdown formatting bug
foreach filename [glob -directory /the/base/directory "*/*.list" "*/*.drc" "*/*.lvs"] {
    # Make backups into .bak
    replaceValue $filename TPSRAM_256X120 $filename ".bak"
}