我正在阅读文件并尝试使用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次。如何替换所有三个字符串??
答案 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" ]
}
}