batch / txt:如何用来自文件的修改输入替换子字符串匹配的数据块

时间:2014-06-25 02:43:25

标签: string batch-file text replace

用户定义的输入文件必须集成到预设输出文件的条目中, 更改给定块[A-Z]和索引[1-75]位置的数据。

带有可变部分通配符的输入文件结构:

* 00asr[1-75] 00asr*
b -v -o 00asr34 00asr34.hkx (example)
b -v 00asr35 00asr35.hkx (example)

如上所述输出文件,但有多个块[A-Z] asr [1-75]:

* Aasr[1-75] Aasr*
* Basr[1-75] Basr*
  ...
* Zasr[1-75] Zasr*

用户必须选择一个给定的字母A-Z来确定字符串的部分和用于替换信息的块。 然后我们可以用%block%asr替换%input%substrings 00asr;然后,它们将匹配%output%中给定的子字符串: * 00asr [1-75] 00asr *>> * Zasr [1-75] Zasr *就Z而言。

@ECHO OFF
ECHO INPUT FILE:
ECHO %1
SET INTEXT=%1
ECHO.
SET /P "LETTER=Letter? "
SET "REPLACE=%LETTER%asr"
SET TMP=tmp.txt

setlocal enabledelayedexpansion

FOR /F "tokens=1,* delims=¶" %%A IN ( '"TYPE %INTEXT%"') DO (
SET string1=%%A
SET modified=!string1:00asr=%REPLACE%!
echo !modified! >> %TMP%
)
PAUSE

I adapted this code.对我来说看起来很好,但我就像个瞎子。

现在需要%TMP%s的第一行[1-75]来确定块中是否有任何偏移量 或者必须比较字符串,覆盖包含子字符串* Zasr [1-75] Zasr *的行与来自%TMP%的相同行; 或者,在覆盖行之前,在%output%中跳过给定数量的行。 我不确定哪个选项更容易实现或更快执行, 因为我完全没有这样做。

整个方法应该是这样的:

输入文件

o <parameters> 00asr3 00asr3.hkx
o <parameters> 00asr4 00asr4.hkx
o <parameters> 00asr5 00asr5.hkx

用户输入

之前的输出

...
p Oasr75 Oasr75.hkx

p Qasr1 Qasr1.hkx
p Qasr2 Qasr2.hkx
p Qasr3 Qasr3.hkx
p Qasr4 Qasr4.hkx
p Qasr5 Qasr5.hkx
p Qasr6 Qasr6.hkx
....

之后的输出
...
p Oasr75 Oasr75.hkx

p Qasr1 Qasr1.hkx
p Qasr2 Qasr2.hkx
o <parameters> Qasr3 Qasr3.hkx
o <parameters> Qasr4 Qasr4.hkx
o <parameters> Qasr5 Qasr5.hkx
p Qasr6 Qasr6.hkx
....

我设法写文件重命名部分就好了;但是这......我甚至没有。 我一直在看各种文章,但由于实际上并不知道任何批次,我没有得到这个。

1非常有帮助,但我无法正确比较字符串,似乎无法将它们分配给变量。

感谢任何帮助。我甚至可能理解我做错了什么(目前大多数情况都是如此)。

1 个答案:

答案 0 :(得分:0)

我自己解决了这个问题。 这是脚本的缩写版本。 稍微清理输入,更改tmp中的标记,获取目标参数, 从文件中删除旧目标字符串,合并文件,删除临时值。 我相信这段代码无论如何都不是很好,所以进一步解释似乎没必要。

@ECHO OFF
SET _PACK=%1
SET "PATH=%~dp0"
SET "_LIST=in.txt"
SETLOCAL ENABLEDELAYEDEXPANSION
SET "_ERROR=0"
:USERINPUT
IF %_ERROR%==1 (
ECHO INVALID INPUT: string too long.
SET "_ERROR=0"
)
IF %_ERROR%==2 (
ECHO INVALID INPUT: non-letter.
SET "_ERROR=0"
)
SET /P "LETTER=ENTER NEW BLOCK LETTER A-Z: "
ECHO "%LETTER%" SELECTED
IF NOT "%LETTER:~1,1%"=="" (
SET "_ERROR=1"
GOTO USERINPUT
)
if "%LETTER%" lss "A" (
SET "_ERROR=2"
GOTO USERINPUT
)
if "%LETTER%" gtr "Z" (
SET "_ERROR=2"
GOTO USERINPUT
)
SET "_STRING=%LETTER%asr"

&#39;在这里重命名文件

SET TMP=asr.tmp
DEL %TMP%
SET "_COUNT=0"
FOR /F "tokens=1,* delims=¶" %%A IN ( '"TYPE %_PACK%"') DO (
SET _LINE=%%A
SET _NEWLINE=!_LINE:0asr=%_STRING%!
ECHO !_NEWLINE!>> %TMP%
CALL SET /A _COUNT=_COUNT+1
)
ECHO NUMBER OF INPUT LINES: !_COUNT!
SET /P _OFFSET=< %TMP%
CALL SET _OFFSET=%%_OFFSET:*asr=%%
CALL SET _OFFSET=%%_OFFSET:~0, 2%%
CALL SET _OFFSET=%_OFFSET: =%
ECHO OFFSET: %_OFFSET%.
SET /A _END=_COUNT+_OFFSET-1
COPY /Y in.txt in.tmp
FOR /L %%X IN (%_OFFSET%, 1, %_END%) DO (
SET "_SEARCH=%_STRING%%%X "
ECHO DELETING OLD STRING : !_SEARCH!
FINDSTR /V /C:"!_SEARCH!" %_PACK% > in.tmp
del in.txt
ren "in.tmp" "in.txt"
)
TYPE %TMP%>> in.txt
DEL %TMP%
PAUSE
DEL %1
EXIT