gpt4 book ai didi

batch-file - 对/f 使用批处理时保留文本文件中的空行

转载 作者:行者123 更新时间:2023-12-04 02:09:24 25 4
gpt4 key购买 nike

我一直在尝试使用批处理脚本查找和替换文本文件中的字符串。我遇到了 this answer这几乎解决了我的问题,但是输出文件中没有保留空行。我试过 this answer too但行以行号 []... [17] 开头

任何帮助扩展 this answer在输出文件中保留空行将不胜感激。
谢谢

    setlocal enableextensions disabledelayedexpansion

set "search=<Tool>"
set "replace=XYZ"

set "textFile=C:\abc.txt"

for /f "delims=" %%i in ('type "%textFile%" ^| find /v /n "" ^& break ^> "%textFile%"') do (
set "line=%%i"
setlocal enabledelayedexpansion
set "line=!line:%search%=%replace%!"
>>"%textFile%" echo(!line!
endlocal
)

输出看起来像:
enter image description here

最佳答案

您没有足够努力地研究第二个链接中的答案 - 它有一个非常有效的解决方案。

我更喜欢使用 *]= 的这种技术的变体。替换而不是子字符串:

@echo off
setlocal enableextensions disabledelayedexpansion

set "search=<Tool>"
set "replace=XYZ"

set "textFile=C:\abc.txt"

for /f "delims=" %%i in ('type "%textFile%" ^| find /v /n "" ^& break ^> "%textFile%"') do (
set "line=%%i"
setlocal enabledelayedexpansion
set "line=!line:*]=!"
if defined line set "line=!line:%search%=%replace%!"
>>"%textFile%" echo(!line!
endlocal
)

但是代码没有优化 - 附加重定向会减慢速度,因为必须打开输出文件并且文件指针定位到循环的每次迭代的文件末尾。在循环之外重定向到临时文件一次,然后使用 MOVE 将原始文件替换为临时文件要快得多。

我也更喜欢使用 FINDSTR 而不是 FIND - 它可以更好地处理长行,并且不需要管道或重定向。
@echo off
setlocal enableextensions disabledelayedexpansion

set "search=<Tool>"
set "replace=XYZ"

set "textFile=C:\abc.txt"

>"%textFile%.new" (
for /f "delims=" %%i in ('findstr /n "^" "%textFile%"') do (
set "line=%%i"
setlocal enabledelayedexpansion
set "line=!line:*:=!"
if defined line set "line=!line:%search%=%replace%!"
echo(!line!
endlocal
)
)
move /y "%textFile%.new" "%textFile%" >nul

说实话,我再也不用纯批处理来修改文本文件了。有太多的边缘情况需要大量神秘的代码来解决。上面的代码还有很多潜在的问题。例如:
  • 搜索字符串不能包含 =
  • 搜索字符串不能以 * 开头或 !
  • 替换字符串不能包含 !
  • 如果搜索和/或替换同时包含 ",替换可能会失败。以及像 & 这样的毒字符, |

  • 我使用 JREPL.BAT regular expression find/replace utility反而。它更快、更健壮、功能更强大。它是纯脚本(混合批处理/JScript),可以在 XP 以后的任何 Windows 机器上本地运行,无需任何 3rd 方 exe 文件。

    例如,以下简单命令可以非常快速地执行您的文字查找/替换。
    call jrepl "<Tool>" "XYZ" /l /f "C:\abc.txt" /o -

    关于batch-file - 对/f 使用批处理时保留文本文件中的空行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38723595/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com