如何在 Windows 批处理脚本中连接换行符

Posted

技术标签:

【中文标题】如何在 Windows 批处理脚本中连接换行符【英文标题】:How to concat new line character in windows batch script 【发布时间】:2022-01-20 08:00:48 【问题描述】:

我有以下代码

@echo off 
setlocal enableextensions disabledelayedexpansion

set "search=hello"
set "replace=hello world"

set "textFile=hello.text"

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

如何使用此脚本在 Hello 和 world 之间添加换行符

我的 hello.txt 包含以下内容:

def a=1
config
    hello

我想换成

def a=1
config
    hello
    world

主要目的是在下一行的hello之后添加world

【问题讨论】:

这取决于,你想为所有用换行符分隔的单词添加换行符吗?还是仅在“Hello World”事件中? 仅在 Hello World 事件中 【参考方案1】:

通过修改替换字符串你可以达到你想要的:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

set "search=hello"
rem // In the following, the empty lines are intentional; ensure that there are not even (trailing) spaces!
set replace=hello^^^

^

    world

set "textFile=hello.txt"

for /F "delims=" %%i in ('type "%textFile%" ^& break ^> "%textFile%" ') do (
    set "line=%%i"
    setlocal EnableDelayedExpansion
    >>"%textFile%" echo(!line:%search%=%replace%!
    endlocal
)

endlocal
exit /B

使用序列 ^^^ + line-break + line-break + ^ + line-break + line-break 你构建了一个双转义换行符,这将导致将字符串 ^ + line-break + line-break 分配给变量 replace。这将在表达式 %replace% 的扩展期间扩展为单个换行符。


不幸的是,上述脚本仅使用换行符作为替换字符串中的换行符,而不是像 Windows-conform 那样使用回车加换行符。为了解决这个问题,可以使用以下脚本:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define a line-break (carriage-return plus line-feed):
for /F %%l in ('copy /Z "%~f0" nul') do (set ^"nl=%%l^
%=empty line =%
^")

set "search=hello"
rem // Use defined line-break variable here (it will not yet be expanded here):
set "replace=hello!nl!    world"

set "textFile=hello.txt"

setlocal EnableDelayedExpansion
rem // At this point the line-break variable is going to be expanded:
for %%j in ("%replace%") do (
    rem /* Use `findstr /N` rather than `type` to precede every line with
    rem    line number plus `:` to avoid loss of empty lines due to `for /F`: */
    for /F "delims=" %%i in ('findstr /N "^^" "!textFile!" ^& break ^> "!textFile!"') do (
        endlocal & set "line=%%i" & setlocal EnableDelayedExpansion
        rem // Remove line number prefix:
        set "line=!LINE:*:=!"
        rem // Actually perform sub-string replacement:
        >>"!textFile!" echo(!line:%search%=%%~j!
    )
)
endlocal

endlocal
exit /B

这种方法还在文本文件中保留空白行。

【讨论】:

以上是关于如何在 Windows 批处理脚本中连接换行符的主要内容,如果未能解决你的问题,请参考以下文章

windows批处理如何替换换行符?

可以用windows批处理脚本连接linux传输文件吗?

在windows中连接postgres的批处理文件

如何在批处理文件中回显换行符?

开发环境Java 文件生成 Windows 系统 .bat 批处理文件并自动执行 ( 输出 GB2312 格式处理中文乱码 | 换行 | Runtime 执行 Cmd 命令 )

一些windows批处理脚本