Как я могу вставить новую строку текста в определенное место в существующем текстовом файле - PullRequest
0 голосов
/ 07 декабря 2018

Мне нужно вставить следующую строку в существующий текстовый файл на многих компьютерах.Поэтому мне нужно автоматизировать это в пакетном файле.

Строка для добавления:

<.add key="StudentAccountPaymentRunEnvironment" value="PRODUCTION"/>

Пункт назначения для этой строки находится в файле с именем: O2-config.txt и в файле O2-config.txt мне нужно вставить строку, показанную выше, сразу после строки, показанной ниже:

<.add key="TuitionPaymentRunEnvironment" value="PRODUCTION"/.>

Таким образом, конечный результат будет:

Существующий

<.add key="TuitionPaymentRunEnvironment" value="PRODUCTION"/> 

Новый

<.add key="StudentAccountPaymentRunEnvironment" value="PRODUCTION"/>

Есть много строк текста, предшествующих и следующих за этими двумя строками.Пожалуйста, порекомендуйте.Я искал и нашел решения для linux, но не для Windows/Command Prompt.Я хочу поместить это решение в файл .bat, который может выполняться с групповой политикой Windows.

Ответы [ 3 ]

0 голосов
/ 07 декабря 2018

Windows 10 поставляется с PowerShell, поэтому вы можете использовать:

## Q:\Test\2018\12\07\SO_53661614.ps1
$Ins = [RegEx]::escape('<.add key="TuitionPaymentRunEnvironment" value="PRODUCTION"/>')
$New = [RegEx]::escape('<.add key="StudentAccountPaymentRunEnvironment" value="PRODUCTION"/>')
(Get-Content .\yourfile.txt) -replace $Ins,($Ins+"`n"+$new)|Set-Content .\yourfile.txt

Упаковка в пакет:

:: Q:\Test\2018\12\07\SO_53661614.cmd
Set "Ins=<.add key="TuitionPaymentRunEnvironment" value="PRODUCTION"/>"
Set "New=<.add key="StudentAccountPaymentRunEnvironment" value="PRODUCTION"/>"
Powershell -Nop -C "(Get-Content .\yourfile.txt).replace($ENV:Ins,$ENV:Ins+\"`n\"+$ENV:New)|Set-Content .\yourfile.txt"
0 голосов
/ 07 декабря 2018

Для решения PURE BATCH мы можем использовать цикл for вместе с оператором if, чтобы найти первую строку, а затем в следующей строке вставить предопределенную фразу.

Ниже вы можете указать имя файла (или включить цикл для поиска по нескольким файлам), строку поиска и строку для добавления строки.Не добавляйте в строку, чтобы добавить строку, вы позаботитесь о любых специальных символах, таких как < & >, используя escape-символ ^.Пример: ^<.Сценарий Base Original: Magoo .

@ECHO OFF
@setlocal EnableDelayedExpansion

Rem | Configuration
Set "FileToEdit=O2-config.txt"
Set "LineToFind=<.add key="TuitionPaymentRunEnvironment" value="PRODUCTION"/>"
Set "LineToPutAfter=^<.add key="StudentAccountPaymentRunEnvironment" value="PRODUCTION"/^>"

Rem | Check If "FileToEdit" Exists
if not exist "%FileToEdit%" (
    echo File "%FileToEdit%" Not Found!
    pause
    goto :EOF
)
goto StartFunction

:StartFunction

Rem | Export SearchString
echo !LineToFind!>> %~dp0LineToFind.txt

Rem | Add Text Under %LineToFind%
(
    FOR /f "delims=" %%i IN (LineToFind.txt) DO (
    SET AddAfter=%%i

    FOR /f "delims=" %%n IN ('findstr /n "^" %FileToEdit%') DO (
        SET line=%%n
        SET line=!line:*:=!

        ECHO(!line!
            IF "!line!"=="!AddAfter!" ECHO(%LineToPutAfter%
        )
    )
)>>%FileToEdit%.TEMP

Rem | Remove LineToFind.txt
DEL LineToFind.txt

Rem | Delete Original File, Restore New
DEL %FileToEdit%
REN %FileToEdit%.TEMP %FileToEdit%

goto :EOF

Пример ввода:

<.add key="Test1" value="PRODUCTION"/>
<.add key="Test2" value="PRODUCTION"/>
<.add key="Test3" value="PRODUCTION"/>
<.add key="Test4" value="PRODUCTION"/>
<.add key="TuitionPaymentRunEnvironment" value="PRODUCTION"/>
<.add key="Test5" value="PRODUCTION"/>
<.add key="Test6" value="PRODUCTION"/>

Пример вывода:

<.add key="Test1" value="PRODUCTION"/>
<.add key="Test2" value="PRODUCTION"/>
<.add key="Test3" value="PRODUCTION"/>
<.add key="Test4" value="PRODUCTION"/>
<.add key="TuitionPaymentRunEnvironment" value="PRODUCTION"/>
<.add key="StudentAccountPaymentRunEnvironment" value="PRODUCTION"/>
<.add key="Test5" value="PRODUCTION"/>
<.add key="Test6" value="PRODUCTION"/>

Для получения справки по любой из команд выполните следующие действия:

  • call /?
  • set /?
  • for /?
  • if /?
  • find /?
  • и т. Д.
0 голосов
/ 07 декабря 2018

С этого сайта можно получить порт Windows sed .

С его помощью вы можете выполнить следующую команду:

sed -i "s/<.add key=.TuitionPaymentRunEnvironment. value=.PRODUCTION.\/>/&\n<.add key=\"StudentAccountPaymentRunEnvironment\" value=\"PRODUCTION\"\/>/" somefile.txt

И после этого необходимо исправить окончания строк:

sed -i ":a;N;$!ba;s/\n/\r\n/g" somefile.txt

Обратите внимание, что я предполагаю, что в вашем файле есть только один экземпляр этого текста.

Для решения, которое изменяет только первое совпадение этой строки, вы можете поместить его в пакетный файл:

set MATCH=.add key=.TuitionPaymentRunEnvironment. value=.PRODUCTION.
sed "0,/%MATCH%/ {s/%MATCH%\/>/&\n<.add key=\"StudentAccountPaymentRunEnvironment\" value=\"PRODUCTION\"\/>/}" somefile.txt > temp.txt
sed ":a;N;$!ba;s/\n/\r\n/g" temp.txt > somefile.txt
del temp.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...