使用tcl查找并替换两个不同文件中的字符串?
我有以下两个文件: +file1.txt 1.3.1 abc 1.3.2 def ...使用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很大,这可能不是最佳选择,因为它一次读取所有数据。方法可能会稍微改
这里有一种方法:
$ 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]