读取文本文件并替换其中的单词

时间:2017-01-11 11:09:21

标签: file tcl

  例如,考虑文件“abc.txt”具有以下内容

     

{GRAPHIC_FILE_1 =“E:/ ge work / hyperview scripting / name.inp”}

     

{GRAPHIC_FILE_1 =“E:/ ge work / hyperview scripting / result.rst”}

     

{GRAPHIC_FILE_1 =“E:/ ge work / hyperview scripting / abaqusresult.odb”}

所以我想要一个脚本,它将读取此.txt文件重新为“* .rst”并替换为给定名称,例如“badapple.rst”

或者我将输入“result.rst”搜索它并将其替换为“badapple.rst”,保持所有相同并将所有其他行复制到新文件

我无法更改它应该写的文本文件的语法  {GRAPHIC_FILE_1 =“E:/ ge work / hyperview scripting / badapple.rst”}

1 个答案:

答案 0 :(得分:1)

要在文件中替换另一个字符串,特别是在您更改字符串长度的地方,如果将整个文件加载到内存中,您将发现它最简单,执行更改在那里,然后再把它写回来。

set filename "abc.txt"

# Read in the file
set f [open $filename]
set content [read $f]
close $f

# Alter what is on $content here; !!READ BELOW!!

# Write out the file; assumes we've got the newlines in the content already
set f [open $filename "w"]
puts -nonewline $f $content
close $f

那么中间那件丢失的东西怎么样?嗯,这取决于你想要做出的改变。这里的细节很重要很多。但是,如果我们想要为result.rst换出badapple.rst,那么使用string map(用其他完全字符串替换完全字符串)非常简单:

set content [string map {"result.rst" "badapple.rst"} $content]

交换每个*.rst有点棘手,因为我们需要在这里定义*真正匹配的内容。我猜它不包括目录分隔符或双引号!鉴于此,regsub -all是一个更合适的工具。

regsub -all {[^\\/""]+\.rst} $content "badapple.rst" content

省略-all会使它只是替换第一个匹配的实例。

正则表达式为:

  • [^\\/""] - 匹配任何^)的字符反斜杠,正斜杠或双引号,由于各种原因(包括引用和可读性
  • + - 前面一个或多个(即一个或多个非坏字符)
  • \. - 句号(需要反斜杠,因为.是RE元字符)
  • rst - 三个字母字符

如果您正在编写自己的RE, 始终 将其放入{大括号}