![](/img/trans.png)
[英]batch script, find string in text file by line then replace whole line with another string
[英]skip header line and replace string in text file in batch script
@echo off
setlocal enableextensions disabledelayedexpansion
for /r %f in (xis_a*) do More +1 %~nxf >> No_header_%~nxf
set "search=:20:"
set "replace={:20:"
for /f "delims=" %%i in ('type (No_header_*.txt) ^& break ^> (No_header_*.txt) ') do (
set "line=%%i"
setlocal enabledelayedexpansion
set "line=!line:%search%=%replace%!"
>>No_header_*.txt echo(!line!
endlocal
)
正在嘗試跳過文本文件中的標題行,並用{:20:替換:20:。 我已經寫過並且幾乎取得了成就..請嘗試幫助我這個新手
@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "destdir=U:\destdir"
set "search=:20:"
set "replace={:20:"
for /r "%sourcedir%" %%f in (xis_a*) do (
REM DEL "%destdir%\No_header_%%~nf.txt" >NUL 2>nul
for /f "usebackqskip=1delims=" %%i in ("%%f") do (
set "line=%%i"
setlocal enabledelayedexpansion
set "line=!line:%search%=%replace%!"
>>"%destdir%\No_header_%%~nf.txt" echo(!line!
ENDLOCAL
)
)
GOTO :EOF
這應該可以解決問題。
在您的代碼中,初始setlocal
建立了默認條件,因此我省略了它。
你必須%f
在你的'for /r
-的%
的metavariable前f
需要加倍。
不需要more
儀式- for /f
有一個skip
選項,將允許skip
前n行。
因此-所需要做的就是獲取由for...%%f...
循環生成的文件列表,並與每個文件一起處理每個文件,跳過第一行。 引用出現在%%f
的文件名只是一種安全措施,允許包含分隔符的文件名,但這意味着需要調用usebackq
來告訴for /f
給出的列表不是文字字符串(它將假定為(帶引號的字符串)),但文件名。
然后,由於%%f
是%%i
循環的上下文,因此可以使用%%~nf
選擇目標文件名。 我不知道你是否希望~nf
或~nxf
(添加第二個.txt
擴展名),所以我選擇使用~n
孤獨。 請注意,您對*
的使用注定會失敗-這意味着“所有文件都匹配”-可能與您想要的不完全相同, cmd
會變得非常混亂。
我已經添加了一個remmed-out del
命令,以允許刪除目標文件-如果需要,只需刪除rem
,否則數據將被附加到任何現有文件中。
我使用u:
驅動器進行測試,並保留了源名稱和目標名稱。 毫無疑問,您將需要更改它們以適合您的系統。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.