例如,考虑文件“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”}
答案 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, 始终 将其放入{
大括号}
。