用子行中的字符串替换文件中的字符串

时间:2015-01-23 08:51:48

标签: windows string shell replace

大家好,我有一个问题。 我有一个每天从外部公司生成的自动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,/
##################

1 个答案:

答案 0 :(得分:0)

我想我能成功!它是纯 版本(涉及No )。这是一个不重要的解决方案(我假设输入文件名为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>

主要技巧是如何取回环境变量。它解决了中调用FOR的内部set循环。

这不是一个完整的解决方案!并非所有可能的错误都经过检查和处理(例如,只有:86:/TYPE/0040/...行可能包含OCMT个子行?它是否有空行?),但它符合简要说明......

我希望这有帮助!