如何查找和替换文本文件中的文本?

来源:百度文库 编辑:神马文学网 时间:2024/05/01 17:55:57
问:
您好,脚本专家!在命令行中,如何使用脚本来打开文件并替换文本;例如,如何将所有“Jim”都替换为“James”?
-- JW
答:
您好,JW。我们以往在处理文本文件时不止一次地发现,并没有实现此操作的简便方法;也就是说,没有能够打开文本文件,然后查找并替换文本的 ReplaceText 命令。所幸的是,从另一个角度来看,这个问题属于典型的文本文件问题:尽管没有执行该任务的简便方法,但是可以通过其他方法来完成。
虽然我们无法直接搜索和替换文本文件中的文本,但可以退而求其次。我们可以这样做:1) 打开文本文件;2) 将文本读取到一个变量中;3) 对该变量执行搜索和替换操作;4) 重新保存文本文件。甚至可以从命令行中执行所有上述操作,我们稍后会说明这一点。我们先从编写执行搜索和替换操作的简单脚本入手:
Const ForReading = 1Const ForWriting = 2Set objFSO = CreateObject("Scripting.FileSystemObject")Set objFile = objFSO.OpenTextFile("C:\Scripts\Text.txt", ForReading)strText = objFile.ReadAllobjFile.ClosestrNewText = Replace(strText, "Jim ", "James ")Set objFile = objFSO.OpenTextFile("C:\Scripts\Text.txt", ForWriting)objFile.WriteLine strNewTextobjFile.Close
首先,创建两个常量(“ForReading”和“ForWriting”),分别用于打开文本文件时的两种情况。(没错,我们说的是两种情况)。我们创建一个“FileSystemObject”实例,然后使用“OpenTextFile”方法打开文件 C:\Scripts\Text.txt 以读取它的内容。
在打开文件的情况下,我们使用“ReadAll”方法将整个文件的内容读取到变量 strText 中。然后关闭 C:\Scripts\Text.txt,但几乎立即将其再次打开以写入内容。不错,看起来这是个笨办法,但 FileSystemObject 就是这样工作的:您可以打开文件来执行读取操作,也可以打开文件来执行写入操作,但不能同时执行这两种操作。(现在您应该明白了,FileSystemObject 的工作方式确实有点让人费解。)
在将文件内容存储在变量 strText 中后,我们接下来使用 VBScript 的“Replace”函数将所有 Jim 都替换为 James。可使用以下这行代码来执行这项操作:
strNewText = Replace(strText, "Jim ", "James ")
请注意,我们查找的是所有“Jim ”(“Jim”后跟一个空格),将它们全部替换为“James ”(“James”后跟一个空格)。尽管算不上绝对安全,但还是可以让脚本具有一点智能;如果脚本遇到“Jimmy”这样的名字,就不会尝试将“Jim”替换为“James”(结果是“Jamesmy”)。我们创建的新文件(在其中将所有 Jim 都替换为 James)存储在内存的 strNewText 变量中。
接下来,我们再次打开文件(执行写入操作),调用“WriteLine”方法,将 strNewText 的内容写入文件中,然后再次关闭文件。实际效果会怎样?如果开始时使用的文本文件的内容如下:
Jim JonesMary SmithJim DoeJim JohnsonMary Johnston
最终得到的文本文件的内容如下:
James JonesMary SmithJames DoeJames JohnsonMary Johnston
要通过命令行来执行所有上述操作,只需对脚本进行修改,以使它(按以下顺序)接受三个命令行参数:要打开的文件的名称,要搜索的文本以及要替换成的文本。以下就是用于完成此操作的脚本。请注意,我们将命令行参数存储在 strFileName、strOldText 和 strNewText 这三个变量中,在打开和保存文本文件以及调用 Replace 函数时将会使用这些变量:
Const ForReading = 1Const ForWriting = 2strFileName = Wscript.Arguments(0)strOldText = Wscript.Arguments(1)strNewText = Wscript.Arguments(2)Set objFSO = CreateObject("Scripting.FileSystemObject")Set objFile = objFSO.OpenTextFile(strFileName, ForReading)strText = objFile.ReadAllobjFile.ClosestrNewText = Replace(strText, strOldText, strNewText)Set objFile = objFSO.OpenTextFile(strFileName, ForWriting)objFile.WriteLine strNewTextobjFile.Close
要使用这个修改过的脚本(我们将其命名为“replace.vbs”),只需在命令行中键入类似以下内容的命令:
cscript replace.vbs "C:\Scripts\Text.txt" "Jim " "James "