如何在tcl中替换文件中的两个或多个字符串

时间:2015-02-23 04:30:06

标签: replace tcl

我正在阅读文件并尝试使用regsub替换不同行中的3个字符串。

输入文件:

This is a bus
This is a car 
This is a bike

预期输出

This is a Plane
This is a Scooter
This is a Bicycle

如果我使用

puts $out [regsub -all "( bus)" $line "\ $x" ]
puts $out [regsub -all "( car)" $line "\ $y" ]
puts $out [regsub -all "( bike)" $line "\ $z" ]

因为我打电话作为一个带有参数x,y,z作为平面,踏板车,自行车的过程。 但这是所有线路打印3次。如何替换所有三个字符串??

3 个答案:

答案 0 :(得分:1)

您还可以使用string map替换字符串:

string map {{ bus} { Plane} { car} { Scooter} { bike} { Bicycle}} $input_string

参数是“find”“replace”字符串对的列表,然后是输入字符串......

顺便说一句。使用regsub方法,您可以嵌套regsub,以便一个的结果成为另一个的输入,例如有两个:regsub -all { bus} [regsub -all { car} $input_string { Scooter}] { Plane}它虽然不是很易读!

另请注意,您无需在表达式中使用括号捕获组:"( car)"会执行您实际未使用的额外子组捕获... { car}是更好...

答案 1 :(得分:1)

最明确的方法是将行写入每次替换之间的变量。回写它所来自的变量通常是最简单的方法。然后,您可以在结尾处输出一次结果。

set line [regsub -all "( bus)" $line "\ $x"]
set line [regsub -all "( car)" $line "\ $y"]
set line [regsub -all "( bike)" $line "\ $z"]
puts $out $line

答案 2 :(得分:0)

如果您逐行阅读文件,可以使用 if 运算符。

while { [ gets $fh line ] >= 0} {
    if {[regexp -all -- { bus} $line]} {
        puts $out [regsub -all "( bus)" $line "\ $x" ]
    } elseif {[regexp -all -- { car} $line]} {
        puts $out [regsub -all "( car)" $line "\ $y" ]
    } else {
        puts $out [regsub -all "( bike)" $line "\ $z" ]
    }
}