谁能告诉我在Windows中使用批处理文件...如何从文件中读取并将bath
包含=的文件中的string =替换bath Abath Bbath XYZbathABC
为字符串,hello
以便输出类似于hello Ahello Bhello XYZhelloABC
Answers:
从Andriy M扩展,是的,您可以从一个文件执行此操作,即使是多行的文件也可以
@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "INTEXTFILE=test.txt"
set "OUTTEXTFILE=test_out.txt"
set "SEARCHTEXT=bath"
set "REPLACETEXT=hello"
for /f "delims=" %%A in ('type "%INTEXTFILE%"') do (
set "string=%%A"
set "modified=!string:%SEARCHTEXT%=%REPLACETEXT%!"
echo !modified!>>"%OUTTEXTFILE%"
)
del "%INTEXTFILE%"
rename "%OUTTEXTFILE%" "%INTEXTFILE%"
endlocal
编辑
感谢David Nelson,我更新了脚本,因此它不再具有硬编码值。
;
是option的默认值,因此该代码也以行开头eol
。!
由于此代码要求启用延迟扩展,因此无法正确处理包含一个或多个行的行。由于替换字符串为空字符串且搜索字符串与整行匹配,因此删除了环境变量时的ECHO输出。搜索字符串不能包含等号,因为在替换表达式中具有特殊含义。echo is off.
modified
=
set "modified1=...
?
SET string=bath Abath Bbath XYZbathABC
SET modified=%string:bath=hello%
ECHO %string%
ECHO %modified%
编辑
起初并没有看到您希望在替换之前先从文件中读取字符串。
好吧,使用批处理文件,您没有太多处理文件的便利。在这种情况下,您必须阅读一行,进行替换,然后输出修改后的行,然后...然后呢?如果您需要替换所有文件中所有'bath'事件,则必须使用循环:
@ECHO OFF
SETLOCAL DISABLEDELAYEDEXPANSION
FOR /F %%L IN (file.txt) DO (
SET "line=%%L"
SETLOCAL ENABLEDELAYEDEXPANSION
ECHO !line:bath=hello!
ENDLOCAL
)
ENDLOCAL
您可以将重定向添加到文件:
ECHO !line:bath=hello!>>file2.txt
或者,您可以将重定向应用于批处理文件。它必须是另一个文件。
编辑2
添加了延迟扩展的适当切换,以正确处理某些具有批处理脚本语法特殊意义的字符,例如!
,^
等。(谢谢,吉布!)
cscript
和PowerShell
在那里,我有时觉得他们会完全废止批处理文件,如果它在所有使用过Windows的境界不是因为剧本的大概数量庞大依然。
为了避免空行跳过(使conf文件具有可读性),我将aflat和jeb答案(在此处)组合为以下内容:
@echo off
setlocal enabledelayedexpansion
set INTEXTFILE=test.txt
set OUTTEXTFILE=test_out.txt
set SEARCHTEXT=bath
set REPLACETEXT=hello
set OUTPUTLINE=
for /f "tokens=1,* delims=¶" %%A in ( '"findstr /n ^^ %INTEXTFILE%"') do (
SET string=%%A
for /f "delims=: tokens=1,*" %%a in ("!string!") do set "string=%%b"
if "!string!" == "" (
echo.>>%OUTTEXTFILE%
) else (
SET modified=!string:%SEARCHTEXT%=%REPLACETEXT%!
echo !modified! >> %OUTTEXTFILE%
)
)
del %INTEXTFILE%
rename %OUTTEXTFILE% %INTEXTFILE%
chcp 65001
对于UTF8:请参阅Windows批处理中的Echo UTF-8字符
为了避免批处理解析器出现问题(例如,感叹号),请查看搜索问题并替换批处理文件。
修改aflat的脚本之后,将包含感叹号之类的特殊字符。
@echo off
setlocal DisableDelayedExpansion
set INTEXTFILE=test.txt
set OUTTEXTFILE=test_out.txt
set SEARCHTEXT=bath
set REPLACETEXT=hello
set OUTPUTLINE=
for /f "tokens=1,* delims=¶" %%A in ( '"type %INTEXTFILE%"') do (
SET string=%%A
setlocal EnableDelayedExpansion
SET modified=!string:%SEARCHTEXT%=%REPLACETEXT%!
>> %OUTTEXTFILE% echo(!modified!
endlocal
)
del %INTEXTFILE%
rename %OUTTEXTFILE% %INTEXTFILE%
我为此做了一个函数,您只在需要编写更多代码的批处理程序中调用它。
工作基本上与其他工作相同,因为这是最好的方法。
这是我拥有该功能的链接
如果您有Ruby for Windows,
C:\>more file
bath Abath Bbath XYZbathABC
C:\>ruby -pne "$_.gsub!(/bath/,\"hello\")" file
hello Ahello Bhello XYZhelloABC