[英]How to replace string inside a bat file with command line parameter string
[英]Replace string in a file with string from sub line
大家好,我有一個問題。 我每天都有一個由外部公司生成的自動txt文件。 當我想將其加載到系統中時出現錯誤,因此最終用戶需要手動重寫文件。
所以我需要創建一個具有以下目標的腳本。
對於以:86:/TYPE/0040/
開頭的每一行
我需要將/TYPE/0040
替換為以/OCMT
開始的下一行的值
例
86:/TYPE/0040/VOR ETRANGE / ==> 86:/OCMT/EUR2405,/VOR ETRANGE /
非常感謝您必須在Windows操作系統上運行任何支持腳本。
這是文件的示例,我有2000多行
##################
:86:/TYPE/0040/VOR ETRANGE /
/ORDP/GALAK CHEZ MAMANLDA
/ORDP/PT
/REMI/TOTOT TATA
/OCMT/EUR2405,/
/EFEE/EUR0,/
:86:/TYPE/0568/VOR/
/REMI//ADV/260050000002 15.1.2015
/ETEI/7026150001
/ORDP/SOC DES POUBELLES
:61:1000000005C20546,28NTRFNONREF//15014215
:86:/TYPE/0568/VOR /
/REMI/00000 0000000 0000000
/ETEI/VIREMENT OREXAD
/ORDP/ORETOPEZZ
:86:/TYPE/0040/VOR toto/
/ORDP/ADVANCED +
/ORDP/US
/REMI/200000000559ISCW APDORTSB
/OCMT/USD37500,/
/EFEE/EUR0,/
##################
我想我能做到! 它是純Windows cmd版本(不涉及powershell )。 這不是一個簡單的解決方案(我假設輸入文件名為conv.txt
):
@echo off
setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
REM Read all lines and store OCMT values in environment variables
set REF=
REM set line=0
FOR /F "tokens=1,2,3 delims=/" %%i IN (conv.txt); DO (
SET /A line += 1
REM echo !line!: %%i, %%j, %%k
set type=%%i
if "!type:~0,1!" == ":" set REF=
IF "%REF%" == "" (
IF "%%i" == ":86:" IF "%%j" == "TYPE" IF "%%k" == "0040" set REF=!line!
)
if "%%i" == "OCMT" set OCMT_!!REF!!=%%j
)
REM Read all lines again and replace
set line=0
FOR /F "tokens=* delims=" %%i IN (conv.txt); DO (
SET /A line += 1
set LL=%%i
IF "!LL:~0,15!" == ":86:/TYPE/0040/" (
FOR /F "tokens=1* delims==" %%a IN ('set OCMT_!line!') DO (
set LL=:86:/OCMT/%%b/!LL:~15!
)
)
echo !LL!
)
輸出:
##################
:86:/OCMT/EUR2405,/VOR ETRANGE /
/ORDP/GALAK CHEZ MAMANLDA
/ORDP/PT
/REMI/TOTOT TATA
/OCMT/EUR2405,/
/EFEE/EUR0,/
:86:/TYPE/0568/VOR/
/REMI//ADV/260050000002 15.1.2015
/ETEI/7026150001
/ORDP/SOC DES POUBELLES
:61:1000000005C20546,28NTRFNONREF//15014215
:86:/TYPE/0568/VOR /
/REMI/00000 0000000 0000000
/ETEI/VIREMENT OREXAD
/ORDP/ORETOPEZZ
:86:/OCMT/USD37500,/VOR toto/
/ORDP/ADVANCED +
/ORDP/US
/REMI/200000000559ISCW APDORTSB
/OCMT/USD37500,/
/EFEE/EUR0,/
##################
它將輸入文件解析兩次。 第一個塊讀取文件並設置環境變量OCMT_<TYPE_LINE>=<OCMT LINE AMOUNT>
(例如OCMT_2=EUR2405,
)。 在第二個塊中,它再次找到以:86:/TYPE/0040/
開頭的行。 然后將其替換為:86:/OCMT/<OCMT LINE AMOUNT>/<rest of the line>
。
主要技巧是如何獲取環境變量。 它是通過在cmd中 set
的內部FOR
循環調用解決的。
這不是一個完整的解決方案! 並非所有可能的錯誤都得到檢查和處理(例如,僅:86:/TYPE/0040/...
行可能包含OCMT
行?行是否可以包含空行?),但它符合簡要說明...
我希望這有幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.