Как заменить строку на второй строке в текстовом файле, используя командный файл? - PullRequest
2 голосов
/ 30 ноября 2010

Хорошо, так что я работал над довольно сложным пакетным файлом, который в основном просит пользователя создать текстовый файл, содержащий 6 (или более) строк текста. Затем он берет этот файл и заменяет каждый экземпляр каждой буквы на свой соответствующий номер (например, если в первой строке текстового файла указано «программируемый», то программа изменит все экземпляры буквы «а» на 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]

1 Ответ

1 голос
/ 30 ноября 2010

Позвольте представить вам моего друга, для цикла . Сохраните все строки, введенные пользователем, в один файл. Я назову этот файл input.txt. Используйте цикл for с переключателем /f и опцией delims= для циклического прохождения каждой строки в файле и сохранения строк в переменной %%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

Как видите, я пропустил ложную задержку. Мне нравятся мои программы быстро. :)

...