我有一个批处理文件,我想打开一个文件并对该文件进行非常简单的搜索和替换,然后保存(覆盖)它执行搜索和替换的文件。
我知道如何读取文件的第一行:
set /p file= < file.txt
但是在读取整个文件并对其进行搜索/替换的批处理方法上苦苦挣扎。
我有一个批处理文件,我想打开一个文件并对该文件进行非常简单的搜索和替换,然后保存(覆盖)它执行搜索和替换的文件。
我知道如何读取文件的第一行:
set /p file= < file.txt
但是在读取整个文件并对其进行搜索/替换的批处理方法上苦苦挣扎。
很难给出明确的答案,因为不清楚您所说的非常简单的搜索和替换是什么意思,但这里有所有需要的元素:
读取文件
您可以使用以下命令逐行读取文件for /f
:
for /f %%a in (myfile.txt) do (
echo %%a
)
替换文本
这是我知道如何替换文本的一种方法:
SETLOCAL ENABLEDELAYEDEXPANSION
for /f "delims=" %%a in (myfile.txt) do (
SET s=%%a
SET s=!s:stringtoreplace=replacementstring!
echo !s!
)
这将输出所有行myfile.txt
并将stringtoreplace替换为replacementstring。
覆盖文件
您可以考虑先写入一个新的临时文件,然后用新的临时文件替换原始文件。
通过上面的例子,它就像>>yourtempfilename.txt
在echo
语句之后添加一样简单。
过滤文件的行
如果您只是想从文件中删除一些行,您也可以考虑使用findstr
命令 ( help findstr
)。
将 filename.txt 和 search1/replace1 替换为您的文件名和正确的搜索/替换字符串或文本。
Echo off
set "textfile=filename.txt"
set "tempfile=filenametemp.txt"
(for /f "delims=" %%i in (%textfile%) do (
set "line=%%i"
setlocal enabledelayedexpansion
set "line=!line:search1=replace1!"
echo(!line!
endlocal
))>"%tempfile%"
del %textfile%
rename %tempfile% %textfile%
您可以在文件中进行搜索和替换,或者使用硬编码字符串或使用 VBScript 的正则表达式(可以通过批处理脚本执行)。
以下是使用硬编码搜索条件进行搜索和替换的示例:
<job>
<script language="JavaScript">
var fso = new ActiveXObject("Scripting.FileSystemObject");
var MyFile = fso.GetFile("c:\\file.json");
var txt = MyFile.OpenAsTextStream(1).ReadAll();
txt = txt.replace("criteria", "replacing value");
WScript.echo("Replaced File"+txt);
var out = MyFile.OpenAsTextStream(2);
out.write(txt);
</script>
将此脚本保存在名为 replace.wsf 的文件中。然后,您可以从这样的批处理文件中执行脚本(在 Windows 操作系统中):
pushd %~dp0
cscript c:\replace.wsf
如果您需要基于正则表达式进行搜索和替换,那么我建议您查看此示例:regex search replace in batch
要添加到Johan A 的答案,如果您希望从用户输入中提供查找/替换字符串而不是硬编码,您可以这样编写。
(我还添加了一个finalfilename
变量,因为我想保持原始文件不变,只生成一个带有输出的新文件。如果您希望它覆盖原始文件,只需将其设置为与源文件名相同)
@ECHO OFF
set "sourcefile=sourcefilename.txt"
set "tempfile=filenametemp.txt"
set "finalfilename=outputfile.txt"
ECHO Enter search term to find:
set /p search1=
ECHO Enter replacement string:
set /p replace1=
ECHO Finding %search1% and replacing with %replace1%
(for /f "delims=" %%i in (%sourcefile%) do (
set "line=%%i"
setlocal enabledelayedexpansion
set "line=!line:%search1%=%replace1%!"
echo(!line!
endlocal
))>"%tempfile%"
:: Delete potential existing final file to avoid duplicate error when renaming
del %finalfilename%
ECHO Setting filename to %finalfilename%
rename %tempfile% %finalfilename%
ECHO Done
:: Pause to see messages
PAUSE