【问题标题】:how to replace a string on the second line in a text file using a batch file?如何使用批处理文件替换文本文件第二行的字符串?
【发布时间】:2010-11-30 13:33:14
【问题描述】:

好吧,我一直在处理一个相当复杂的批处理文件,它基本上要求用户创建一个包含 6 行(或更多)文本的文本文件。然后它获取该文件并将每个字母的每个实例更改为其各自的数字(例如,如果文本文件的第一行说“可编程”,那么程序会将字母“a”的所有实例更改为 1 和“b”进入 2 以此类推,直到全部为数字。然后它将显示为“16 18 15 7 18 1 13 1 2 12 5”),我将使用以下脚本来做到这一点:

set /p var=< text.txt
set var=%var:a=1%
echo.%var% >> text.txt

然而,这个脚本的唯一问题是它只会将第一行的字母 a 更改为 1,而不是文档其余部分的字母“a”。

我还尝试在程序开始时拆分文档,以便当用户键入第一行的文本时,它会将其发送到单独的隐藏文件 (text1.txt),而不仅仅是发送所有文本行用户输入到一个文本文件 (text.txt) 中

我是用这个来做的:

set /p line1=type the first line:
echo %line1% >> text1.txt
attrib +h text1.txt
set /p line2=type the second line:
echo %line2% >> text2.txt
attrib +h text2.txt
:: ########################################################################
:: Im not going to repeat this 6 times but hopefully you get my point
:: ########################################################################

现在将行拆分为单独文件的问题在于,将每个字母的所有实例更改为各自的数字,并为每一行(或在这种情况下,文件(行到文件中。

代码:(另存为“stringparsing.bat”)

 @echo off
 title BETA
 cls
 echo.
 echo.
 echo.
 echo      Setting Variables...
 echo      Loading Language Database...
 :: ###################################################################################
 ::    CALLING VARIABLE DATABASE CALLING VARIABLE DATABASE CALLING VARIABLE DATABASE
 :: ###################################################################################
 :: An Idea i was thinking of trying was to put a subscript here that calls another 
 :: batch file that contains a list of the letters set as variables to their 
 :: respective numbers (example: SET a=1, SET b=2, SET c=3)
 :: -----------------------------------------------------------------------------------
 PING 1.1.1.1 -n 1 -w 3000 >NUL
 goto MAIN
 :MAIN
 set foo=0
 cls
 echo.
 echo.
 echo.
 echo.
 echo            ===================================
 echo             #################################        
 echo             #######     Main Menu:    #######
 echo             #################################
 echo            ===================================
 echo.    
 echo.
 echo             1.) Create New Language File...
 echo.
 echo             2.) Load Existing Lanuage File...
 echo.
 echo             3.) Settings...
 echo ---------------------------------------------------------
 SET /p CHOICE= Select a Function:
 IF %CHOICE%== 1 GOTO CREATE
 IF %CHOICE%== 2 GOTO LOAD
 IF %CHOICE%== 3 GOTO SETTINGS
 GOTO MAIN
 :CREATE
 cls
 title Step 1
 echo.
 echo.
 echo.
 echo                echo ============================================================================
 echo.
 set /p name=  please type a name for your new language file:
 echo.
 echo         =================================================================================
 cls
 echo.
 echo.
 echo.
 echo   ==============================================================
 echo   ##############################################################
 echo   #============================================================#
 echo   #                                                            #
 echo   # - After you hit enter you will be redirected               #
 echo   #   to a Live Typer. so anything you type into               #
 echo   #   it will be sent to %name%.txt.                           #
 echo   #                                                            #
 echo   #                                                            #
 echo   # - Next, select load language!                              #
 echo   #                                                            #
 echo   #============================================================#
 echo   ##############################################################
 echo   ==============================================================
 pause 
 goto typer1
 :typer1
 cls
 set /p line1= :
 echo %line1% >> %name%1.txt
 attrib +h %name%1.txt
 cls
 set /p line2= :
 echo %line2% >> %name%2.txt
 attrib +h %name%2.txt
 cls
 set /p line3= :
 echo %line3% >> %name%3.txt
 attrib +h %name%3.txt
 cls
 set /p line4= :
 echo %line4% >> %name%4.txt
 attrib +h %name%4.txt
 cls
 set /p line5= :
 echo %line5% >> %name%5.txt
 attrib +h %name%5.txt
 cls
 set /p line6= :
 echo %line6% >> %name%6.txt
 attrib +h %name%6.txt
 cls
 echo.
 echo.
 echo.
 echo ==========================================================
 echo.
 (
 IF EXIST %name%1.txt echo - FIRST LINE CONFIRMED.
 IF EXIST %name%2.txt echo - SECOND LINE CONFIRMED.
 IF EXIST %name%3.txt echo - THIRD LINE CONFIRMED.
 IF EXIST %name%4.txt echo - FOURTH LINE CONFIRMED.
 IF EXIST %name%5.txt echo - FIFTH LINE CONFIRMED.
 IF EXIST %name%6.txt echo - SIXTH LINE CONFIRMED.
 echo %name% > Language_File.txt
 attrib +h Language_File.txt
 set /a foo+ =1
 )
 echo.
 echo ==========================================================
 goto LOAD
 :LOAD
 set /a foo+ =1
 IF %foo%== 2 goto loadexternal
 goto LOAD23
 :loadexternal
 echo.
 echo language file is loading now!
 pause > nul
 cls
 set /p name=<Language_File.txt
 echo.
 echo.
 echo Language_File Loaded!
 pause >nul
 goto LOAD23
 :LOAD23
 cls
 echo.
 echo.
 echo.
 echo.
 echo.
 echo        Encoding Your Language File... Please Wait... 
 echo.
 echo.
 echo.
 PING 1.1.1.1 -n 1 -w 3000 >NUL
 :A1
 set /p var=< %name%1.txt
 set var=%var:a=1%  
 echo.%var%
 echo %var% >  %name%1.txt
 echo.
 echo.
 echo.
 echo         "A" done.
 goto B1
 :B1
 set /p var=< %name%1.txt
 set var=%var:b=2%  
 echo.%var%
 echo %var% >  %name%1.txt
 echo.
 echo.
 echo.
 echo         "B" done.
 goto C1
 :C1
 set /p var=< %name%1.txt
 set var=%var:c=3% 
 echo.%var%
 echo %var% >  %name%1.txt
 echo.
 echo.
 echo.
 echo         "C" done.
 goto D1
 :D1
 set /p var=< %name%1.txt
 set var=%var:d=4%  
 echo %var% >  %name%1.txt
 echo         "D" done.
 goto E1
 :E1
 set /p var=< %name%1.txt
 set var=%var:e=5%  
 echo %var% >  %name%1.txt
 echo         "E" done.
 goto F1
 :F1
 set /p var=< %name%1.txt
 set var=%var:f=6%  
 echo %var% >  %name%1.txt
 echo         "F" done.
 pause
 cls
 type %name%.txt
 pause >nul
 goto MAIN
 :END 
 cls
 title SHUTTING DOWN...
 echo.
 echo.
 echo.
 echo            Terminating service stream...
 echo.
 echo.
 echo.
 echo.
 echo            Done! Thank you for using this program!
 ping 1.1.1.1 w -n 1 -w 6000 > NUL
 Exit***

如果您有解决方案,我会很高兴听到它,因为我一直在寻找解决此问题的方法,但一无所获。另外,如果有人注意到我的脚本中的任何其他错误或错误,请随时发表评论!

提前致谢!

PS。如果我在这个主题中发布的最后一个脚本没有正确或全部混淆,那么只需从此链接下载脚本:

[http://home.danieljewison.operaunite.com/f/content/Documents/stringparsing.bat][1]

【问题讨论】:

  • 您是否考虑过使用现代编程语言(Python...Ruby...任何东西)?在这一点上,我真的没有任何充分的理由可以想到使用批处理文件(......嗯,真的是过去 10 年)。
  • 好吧,如果我对这些语言中的任何一种有所了解,我会尝试用 c++ 编写程序,并且我得到了所有这些语言的源代码,但我不知道如何编译它们,因为所有那里的编译器真的很混乱,问我这么多参数,你必须下载很多才能让它们工作......但是使用批处理你只需要记事本:P加上我在shell /批处理编程方面比我好得多在任何其他语言中(尽管我很想扩展我对 shell 的了解,因为我很确定 shell 包括批处理文件之外的其他部分。

标签: string command-line text types batch-file


【解决方案1】:

让我把你介绍给我的朋友for loop。将用户输入的所有行保存到一个文件中。我将此文件称为input.txt。使用带有/f 开关和delims= 选项的for 循环循环遍历文件中的每一行,并将这些行存储在变量%%i 中。如果没有delims=,它将只读取到第一个空白字符。

对于它读取的每一行,进行文本替换。批处理编程的“陷阱”是当您在for 循环中设置变量时,您必须在文件顶部添加行setlocal enabledelayedexpansion,并使用! 而不是% 来访问变量内容.

@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%i in (input.txt) do (
echo translating "%%i"... ^<insert fake delay here^>
set var=%%i
set var=!var:a=1 !
set var=!var:b=2 !
set var=!var:c=3 !
set var=!var:d=4 !
set var=!var:e=5 !
set var=!var:f=6 !
set var=!var:g=7 !
set var=!var:h=8 !
set var=!var:i=9 !
set var=!var:j=10 !
set var=!var:k=11 !
set var=!var:l=12 !
set var=!var:m=13 !
set var=!var:n=14 !
set var=!var:o=15 !
set var=!var:p=16 !
set var=!var:q=17 !
set var=!var:r=18 !
set var=!var:s=19 !
set var=!var:t=20 !
set var=!var:u=21 !
set var=!var:v=22 !
set var=!var:w=23 !
set var=!var:x=24 !
set var=!var:y=25 !
set var=!var:z=26 !
echo !var!
)

如果input.txt 有这些内容:

programable
this is line 2
third line

然后输出将如下所示:

C:\batch>encode.cmd
translating "programable"... <insert fake delay here>
16 18 15 7 18 1 13 1 2 12 5
translating "this is line 2"... <insert fake delay here>
20 8 9 19  9 19  12 9 14 5  2
translating "third line"... <insert fake delay here>
20 8 9 18 4  12 9 14 5

如您所见,我忽略了假延迟。我喜欢我的程序快。 :)

【讨论】:

  • 或者这个,如果我们链接相关问题:stackoverflow.com/questions/130116/…
  • 非常感谢,这正是我想要的!顺便说一句,使用名为 PING 1.1.1.1 -n 1 -w 3000 >NUL 的通用命令来伪造延迟 im 您知道将脚本暂停指定秒数/毫秒的更有效方法吗?谢谢!
  • @daniel11:据我所知,在没有自定义程序的情况下,您的 ping 技巧已尽善尽美。
  • 好吧,我想做的另一件事是让这个脚本以某种方式工作:@echo off cls color A :MAIN cls echo。回声。回声 ================================== 回声。 set /p var= 你叫什么名字? :: 不显示(从这里开始)回声。 echo =================================: :: 不显示(在此结束)设置 /p answer= 所以你的名字是%var%? IF %answer%== 是 echo 那是一个了不起的名字! IF %answer%== no goto MAIN 被评论包围的部分由于某种原因不想显示...有什么想法吗?
猜你喜欢
  • 2011-02-15
  • 2014-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-15
  • 2011-07-13
  • 1970-01-01
相关资源
最近更新 更多