使用tcl查找并替换两个不同文件中的字符串?

使用tcl查找并替换两个不同文件中的字符串?,tcl,Tcl,我有以下两个文件: +file1.txt 1.3.1 abc 1.3.2 def ... 这里有一种方法: $ tclsh replace.tcl abc , value x value y def , value a value b sharad$ cat file2.txt abc , value x value y def , value a value b $ 注意:如果file1.txt和file2.txt很大,这可能不是最佳选择,因为它一次读取所有数据。方法可能会稍微改

我有以下两个文件:

+file1.txt

1.3.1 abc 1.3.2 def ...
这里有一种方法:

$ tclsh replace.tcl
abc , value x value y
def , value a value b

sharad$ cat file2.txt
abc , value x value y
def , value a value b

$
注意:如果file1.txt和file2.txt很大,这可能不是最佳选择,因为它一次读取所有数据。方法可能会稍微改变,每次从每个文件中读取一行

$ cat replace.tcl
proc getReplaceMap {fileName} {
    set fd [open $fileName]
    set data [read $fd]
    close $fd

    array set replaceMap {}
    foreach line [split $data "\n"] {
        set line [string trim $line]
        if {$line eq ""} {
            continue
        }
        set replaceMap([lindex $line 1]) [lindex $line 0]
    }
    return [array get replaceMap]
}

proc getUpdatedLine {line replaceMap} {
    array set replacement $replaceMap
    set lineElements [split $line]
    foreach element [array names replacement] {
        set index [lsearch $element $lineElements]
        if {$index != -1} {
            set lineElements [lreplace $lineElements $index $index $replaceMap($element)]
        }
    }
    return [join $lineElements]
}

proc getUpdatedContents {fileName replaceMap} {
    set fd [open $fileName]
    set data [read $fd]
    close $fd

    set newData {}
    foreach line [split $data "\n"] {
        lappend newData [getUpdatedLine $line $replaceMap]
    }
    return [join $newData "\n"]
}

# Main begins here
set replaceMap [getReplaceMap file1.txt]
set newContents [getUpdatedContents file2.txt $replaceMap]
puts $newContents
# Now write to file
set fd [open file2.txt w]
puts $fd $newContents
close $fd


$
执行输出:

$ tclsh replace.tcl
abc , value x value y
def , value a value b

sharad$ cat file2.txt
abc , value x value y
def , value a value b

$
后来

$ cat file2.txt
1.3.1  , value x value y
1.3.2  , value a value b

将键和替换值加载到字典中:

package require fileutil

foreach {val key} [::fileutil::cat file1.txt] {
    dict set replacements $key $val
}
遍历另一个文件,查找关键字并替换它们:

set result {}
::fileutil::foreachLine line file2.txt {
    set key [regexp -inline {^\S+} $line]
    if {[dict exists $replacements $key]} {
        lappend result [regsub ^$key $line [dict get $replacements $key]]
    }
}
::fileutil::writeFile file3.txt [join $result \n]
fileutil
包是Tcl标准库Tcllib的一部分

文件: , , , , , , , , , , ,

我对帖子做了一些修改。可以吗?另外,
file1.txt
中的第一行是否也与
file2.txt
中的第一行匹配?或者您必须检查
file1.txt
中的每一行,并尝试与
file2.txt
中第一个逗号前的第一个单词/部分匹配吗?file2.txt前后有许多行,因此它将与file1.txt的第一行不匹配。还有更多详细信息吗?您收到的答案如何?所有命令都记录在
$ cat file2.txt
1.3.1  , value x value y
1.3.2  , value a value b
package require fileutil

foreach {val key} [::fileutil::cat file1.txt] {
    dict set replacements $key $val
}
set result {}
::fileutil::foreachLine line file2.txt {
    set key [regexp -inline {^\S+} $line]
    if {[dict exists $replacements $key]} {
        lappend result [regsub ^$key $line [dict get $replacements $key]]
    }
}
::fileutil::writeFile file3.txt [join $result \n]