如何在不替换已更改文本的情况下替换文本

3

我正在尝试重复替换文件中的文本。但是,一旦我替换了文本,它就会再次被替换。

我使用一个 .vbs 文件来替换文本,以及一个 .bat 文件来重复执行 .vbs 文件。我试图以这样的方式执行它,即在替换文本后,不再替换它。

我有一个名为 replace.vbs 的 .vbs 文件,我从这个链接中获取:

如何在 Windows 命令行环境中查找和替换文件中的文本?

Const ForReading = 1    
Const ForWriting = 2

strFileName = Wscript.Arguments(0)
strOldText = Wscript.Arguments(1)
strNewText = Wscript.Arguments(2)

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(strFileName, ForReading)
strText = objFile.ReadAll
objFile.Close

strNewText = Replace(strText, strOldText, strNewText)
Set objFile = objFSO.OpenTextFile(strFileName, ForWriting)
objFile.Write strNewText  'WriteLine adds extra CR/LF
objFile.Close

我有一个批处理文件,可以重复执行replace.vbs(完整脚本重复运行 replace.vbs 56次)。

SET abcpath=C:\test\myFile.txt

cscript replace.vbs %abcpath% "Hello World" "Testing"
cscript replace.vbs %abcpath% "Testing" "Text"

PAUSE

我的myFile.txt文件中的文本是"Hello World Testing",期望的输出是"Testing Text",但实际输出是"Text Text"。如何让第二次执行replace.vbs时忽略掉第一次执行时替换过的所有文本?

可能有一个更简单的解决方案我没有想到,所以我想先退回一步。实际上我正在尝试处理包含字母a到g(大小写不敏感)后面跟着最多3个撇号或4个逗号的文本文件(该文件不包含逗号和撇号)。共有52种组合方式,我正在尝试将每种可能的组合映射到一个字母(因为它区分大小写,所以有52个不同的字母)。


1
首先,你为什么不先替换“Testing”,然后再替换“Hello World”,看看是否可行呢? - 41686d6564 stands w. Palestine
我只是用“Hello World”和“Testing”作为示例,以避免混淆。(过于具体的细节即将到来)我实际上要做的是获取一个文本文件,其中包含字母a到g(大写和小写),后跟最多3个撇号或最多4个逗号(在任何时候都没有逗号和撇号)。共有52种组合,我正在尝试将每个可能的组合映射到一个字母(52个不同的字母,因为它区分大小写)。 - Daniel Garcia
1
这似乎是关键信息。请[编辑]问题并添加具体示例,以便更容易理解。 - 41686d6564 stands w. Palestine
这个问题似乎可以通过适当的正则表达式支持来解决,不要重复造轮子 - 看看JRepl.bat。顺便说一句,[编辑]你的问题以包含一些示例和其他信息。 - user6811411
2个回答

1
没有看到您要映射的实际序列,很难建议该怎么做,但通常先映射最长的序列。此外,如果将序列映射到可由另一个映射替换的内容,请首先将其临时映射到一些唯一的序列,这些序列不会被后续映射替换。对于每个映射都要这样做。然后,完成所有映射后,将临时唯一序列替换为最初想要映射到的内容。
在您的示例中,您将“Hello World”映射到一些不出现在数据中的序列,比如“--1--”,一旦所有映射完成,将“--1--”映射到“Testing”。
以下是如何修改您的replave.vbs脚本以实现我的建议。
SET abcpath=C:\test\myFile.txt

cscript replace.vbs %abcpath% "Hello World" "--1--"
cscript replace.vbs %abcpath% "Testing" "--2--"

cscript replace.vbs %abcpath% "--1--" "Testing"
cscript replace.vbs %abcpath% "--2--" "Text"

PAUSE

-1

我认为最初的Replace()操作导致myFile.txt包含:"Testing Testing"

当你第二次调用脚本时,它会找到两个“Testing”值并将它们替换为“Text”。

为了得到期望的输出,你需要修改批处理文件如下:

SET abcpath=C:\test\myFile.txt

cscript replace.vbs %abcpath% "Hello" "Testing"
cscript replace.vbs %abcpath% "World Testing" "Text"

PAUSE

替换序列可能是这样的:

1. Hello World Testing
2. Testing World Testing
3. Testing Text

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接