批量查找和替换字符串添加空行

时间:2017-08-27 16:07:57

标签: windows batch-file batch-processing

我得到了这个代码(在这个question中)找到并替换了字符串,但它在输出文件的末尾添加了一个空白的新行并使其无法使用。

@echo off &setlocal
set "Russian=g_language = Russian"
set "English=g_language = English"

set "textfile=user.cfg"
set "newfile=user.bak"

Call :SwapLang Russian

:search
Color 9B
@echo off&prompt :&mode con cols=60 lines=16


echo.
echo.
echo.
echo.
echo.
echo.
echo.
echo                      PLEASE RUN NOTEPAD
echo.
echo.
echo.
echo.
echo.

:search
TIMEOUT /T 2
TASKLIST|FIND "notepad.exe"
IF %ERRORLEVEL% equ 0 (GOTO found) ELSE (GOTO search)

:found

Call :SwapLang English

Goto :Eof

:SwapLang %1 byRef
( for /f "delims=" %%i in (%textfile%) do (
  set "line=%%i"
  setlocal EnableDelayedExpansion
  If /I "!line:~0,12!" Equ "g_language =" (
    echo(!%1!
  ) Else (
    echo(!line!
  )
  endlocal
)) > "%newfile%"
del %textfile%
rename %newfile%  %textfile%
Goto :Eof

INPUT FILE:它有6行,没有空行。

sys_usefrontline = 1
net_frontline_address = s1.gmru.net
net_frontline_port = 5050
g_language = Russian
cl_promoPageWidth = 820
cl_promoPageHeight = 726

OUTPUT1文件:它有7行,最后一行是空白的(这里不能显示)。

sys_usefrontline = 1
net_frontline_address = s1.gmru.net
net_frontline_port = 5050
g_language = Russian
cl_promoPageWidth = 820
cl_promoPageHeight = 726

OUTPUT2文件:它有7行,最后一行是空白的(这里不能显示)。

sys_usefrontline = 1
net_frontline_address = s1.gmru.net
net_frontline_port = 5050
g_language = English
cl_promoPageWidth = 820
cl_promoPageHeight = 726

有人可以帮我这个吗?

2 个答案:

答案 0 :(得分:0)

批量不是编辑文件的理想选择。此批处理使用PowerShell使用正则表达式进行编辑:

:: Q:\Test\2017\08\25\SO_45879928.cmd
@echo off &setlocal

set "textfile=user.cfg"

Call :SwapLang Russian

:search
Color 9B
@echo off&prompt :&mode con cols=60 lines=16
echo.
echo.
echo                      PLEASE RUN NOTEPAD
echo.
echo.
:search
TIMEOUT /T 2
TASKLIST|FIND "notepad.exe"
IF %ERRORLEVEL% equ 0 (GOTO found) ELSE (GOTO search)

:found

Call :SwapLang English

Goto :Eof

:SwapLang %1
Powershell -NoP -C "$txt=(gc %textfile% -raw) -replace '(?<=g_language = )(English|Russian)','%1';[IO.File]::WriteAllText('%textfile%', $txt)"

Goto :Eof

答案 1 :(得分:0)

我已使用msr.exe通过2个命令行解决了您的原始问题Batch check and replace string then wait for a process,如下所示:(完整的消息在那里,彩色屏幕截图

msr -p user.cfg -it "(g_language\s*=\s*)\w*" -o "${1}Russian" -R

msr -p user.cfg -it "(g_language\s*=\s*)\w*" -o "${1}English" -R

Additonaly,对于您的问题,还有1条删除尾部新行的命令:

msr -p your-files-dirs -S -t "[\r\n]+$" -o "" -R

或删除尾部空格和新行:

msr -p your-files-dirs -S -t "\s+$" -o "" -R

根据stackoverflow规则,请再次说:msr.exe / msr.gcc* / msr.cygwin等位于我的开放项目 https://github.com/qualiu/msr {{1 }}目录,作为 M atch / S earch / R eplace文件/管道/块的一般工具。

相关问题