Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Поиск строки по слову и добавление новой строки после найденой. (http://forum.oszone.net/showthread.php?t=261235)

Mikhael2011 25-05-2013 23:36 2156300

Поиск строки по слову и добавление новой строки после найденой.
 
Уважаемые, пожалуйста окажите помощь!

Задача такова:

Есть текстовый файл примерно такого вида:

12:40:18;2448;DFEGB;FDSF
12:43:04;8393;;RAAI 18
12:43:25;24897;LKUY;KJLLKO
12:47:16;28627;;MIHIUH
12:47:20;29572;KLKGHJHr;SAGFHAY
;8489;ADVB;In 2;0:00:03
;31027;ADVB;DBXL2312;0:00:09
;30830;ADVB;DBXL2271;0:00:20
;31044;ADVB;DBXL2315;0:00:12
;31026;ADVB;DBXL2311;0:00:09
;31052;ADVB;DBXL2317;0:00:15
;30436;ADVB;DBXL2200;0:00:27
;31017;ADVB;DBXL2309;0:00:13
;8499;ADVB;Out 2;0:00:05
12:53:48;29961;FDKQ;HHKJHIK
12:57:43;26093;;HJHKJHAW
и т.д.

Необходимо написать батник, которому передается название этого текстового файла.

В нем нужно найти строки содержащие текст "DBXL" и добавить после каждой такой строки строку с определенным текстом.
Например ";VSTAVKA".

Обработанный файл нужно сохранить под тем же именем.

Возможно кто то уже сталкивался с похожей задачей.
Буду весьма благодарен за любую подсказку.

Заранее огромное спасибо!

Iska 26-05-2013 00:06 2156312

Пробуйте:
читать дальше »
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

set sFile=%~1
set sString4Find=DBXL
set sString4Append=;VSTAVKA

call :GetTemporaryName

if defined sFile (
        if exist "%sFile%" (
                for /f "usebackq eol= delims=" %%i in ("%sFile%") do (
                        echo %%i| >nul find.exe "%sString4Find%" && (
                                >>"%TemporaryName%" echo %%i%sString4Append%
                        ) || (
                                >>"%TemporaryName%" echo %%i
                        )
                )
               
                if exist "%sFile%.bak" del /f /q "%sFile%.bak"
                ren "%sFile%" "%sFile%.bak"
                copy /y "%TemporaryName%" "%sFile%"
                del /f /q "%TemporaryName%"
        ) else (
                echo Source file [%sFile%] not found.
        )
) else (
        echo Usage: %~nx0 ^<source file^>
)

endlocal
exit /b 0
rem ==========================================================================

rem ==========================================================================
rem Функция GetTemporaryName()
rem
rem Серый форум / CMD/BAT: генерация пути для временного файла или папки
rem (http://forum.script-coding.com/viewtopic.php?id=6259)
rem ==========================================================================
:GetTemporaryName
        setlocal enableextensions enabledelayedexpansion

:NextName
        set sTempName=%temp%\temp%random%.tmp

        if exist "%sTempName%" goto :NextName

        set sProcName=%~0

        endlocal & set %sProcName:~4%=%sTempName%
        exit /b 0
rem ==========================================================================


Mikhael2011 26-05-2013 00:19 2156316

Супер! Спасибо большое!
Работает!
Единственно, что добавляет запись в ту же строку.
Попробую добавить перевод строки.

еще раз благодарю!

Iska 26-05-2013 00:54 2156329

Цитата:

Цитата Mikhael2011
Единственно, что добавляет запись в ту же строку. »

Э… Я понял фразу:
Цитата:

Цитата Mikhael2011
и добавить после каждой такой строки строку с определенным текстом. »

именно как «добавить в конец той же строки».

Пробуйте:
читать дальше »
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

set sFile=%~1
set sString4Find=DBXL
set sString4Append=;VSTAVKA

call :GetTemporaryName

if defined sFile (
        if exist "%sFile%" (
                for /f "usebackq eol= delims=" %%i in ("%sFile%") do (
                        echo %%i| >nul find.exe "%sString4Find%" && >>"%TemporaryName%" (
                                echo %%i
                                echo %sString4Append%
                        ) || (
                                >>"%TemporaryName%" echo %%i
                        )
                )
               
                if exist "%sFile%.bak" del /f /q "%sFile%.bak"
                ren "%sFile%" "%sFile%.bak"
                copy /y "%TemporaryName%" "%sFile%"
                del /f /q "%TemporaryName%"
        ) else (
                echo Source file [%sFile%] not found.
        )
) else (
        echo Usage: %~nx0 ^<source file^>
)

endlocal
exit /b 0
rem ==========================================================================

rem ==========================================================================
rem Функция GetTemporaryName()
rem
rem Серый форум / CMD/BAT: генерация пути для временного файла или папки
rem (http://forum.script-coding.com/viewtopic.php?id=6259)
rem ==========================================================================
:GetTemporaryName
        setlocal enableextensions enabledelayedexpansion

:NextName
        set sTempName=%temp%\temp%random%.tmp

        if exist "%sTempName%" goto :NextName

        set sProcName=%~0

        endlocal & set %sProcName:~4%=%sTempName%
        exit /b 0
rem ==========================================================================


Mikhael2011 26-05-2013 01:12 2156331

Теперь просто идеально.
Не знаю как и благодарить.
Вы мне очень помогли. Спасибо!

Mikhael2011 26-05-2013 02:07 2156353

К сожалению возникла еще одна проблема.
Если в тексте встречается символ &, то батник, судя по всему, считает следующее за ним слово командой.
И соответственно в каждом случае выдает сообщение, что это не является внутренней или внешней командой, исполняемым или пакетным файлом.

Iska 26-05-2013 06:27 2156383

Mikhael2011, поздравляю! Вы созрели для WSH:
читать дальше »
Код:

Option Explicit

Dim objFSO
Dim objTSSource
Dim objTSDest

Dim strString4Find
Dim strString4Append

Dim strSourceFile
Dim strTempFile
Dim strBackupFile

Dim strLine


If WScript.Arguments.Count = 3 Then
        With WScript.CreateObject("Scripting.FileSystemObject")
                strSourceFile = .GetAbsolutePathName(WScript.Arguments.Item(0))
               
                If .FileExists(strSourceFile) Then
                        strString4Find  = WScript.Arguments.Item(1)
                        strString4Append = WScript.Arguments.Item(2)
                       
                        strTempFile = GetTemporaryName()
                       
                        Set objTSSource = .OpenTextFile(strSourceFile)
                        Set objTSDest  = .CreateTextFile(strTempFile)
                       
                        Do Until objTSSource.AtEndOfStream
                                strLine = objTSSource.ReadLine()
                               
                                objTSDest.WriteLine strLine
                               
                                If InStr(1, strLine, strString4Find, vbTextCompare) > 0 Then
                                        objTSDest.WriteLine strString4Append
                                End If
                        Loop
                       
                        objTSDest.Close
                        objTSSource.Close
                       
                        Set objTSDest  = Nothing
                        Set objTSSource = Nothing
                       
                        strBackupFile = .BuildPath(.GetParentFolderName(strSourceFile), .GetBaseName(strSourceFile) & ".bak")
                       
                        .CopyFile strSourceFile, strBackupFile, True
                        .CopyFile strTempFile, strSourceFile, True
                Else
                        WScript.Echo "Can't find source file [" & strSourceFile & "]."
                End If
        End With
Else
        WScript.Echo "Usage: cscript.exe //nologo " & WScript.ScriptName & " <Source file> <String for find> <String for append>"
End If

WScript.Quit 0

'=============================================================================
' Серый форум / vbscript: генерация пути для временного файла или папки
' (http://forum.script-coding.com/viewtopic.php?id=1221)
'=============================================================================
Function GetTemporaryName()
        Const TemporaryFolder = 2
       
        Dim strTempName
       
        With WScript.CreateObject("Scripting.FileSystemObject")
                Do
                        strTempName = .BuildPath(.GetSpecialFolder(TemporaryFolder), .GetTempName)
                Loop While .FileExists(strTempName) Or .FolderExists(strTempName)
        End With
       
        GetTemporaryName = strTempName
End Function
'=============================================================================


Georgio 26-05-2013 15:35 2156570

Код:

@ECHO OFF
SET File=My_File.txt
FOR /F "tokens=1* delims=:" %%I IN ('FINDSTR /N /R . %File%') DO (
 ECHO %%J|((FINDSTR DBXL>nul&&ECHO %%J>>New_File.txt&&ECHO ;VSTAVKA>>New_File.txt)||ECHO %%J>>New_File.txt)
)
REN %File% %File%.old&&REN New_File.txt %File%


К сожалению, зтот скрипт также "чувствителен" к символу "&". Но эту проблему можно решить, заменив при помощи "Блокнота" все символы "&" в тексте на какой-нибудь другой символ, который не встречается в тексте, или на сочетание символов, которое точно не будет фигурировать в тексте, а после применения скрипта в полученном тексте поменять этот символ или это сочетание символов снова на "&". Только не используйте для замены символы "%", "^", "|" и. т. п., так как они также могут привести к аналогичной ошибке.

Кстати, ещё возникала проблема с точкой с запятой (";") в начале строк, но она была решена.

Iska 26-05-2013 18:55 2156684

Цитата:

Цитата Georgio
возникала проблема с точкой с запятой (";") »

Код:

"eol="
В документации ни Windows XP, ни Windows 7 об этом не сказано, но действует умолчание — «;»: For /f - Loop through text | SS64.com.

Georgio 27-05-2013 03:46 2156888

"Поборол" "противный" амперсанд (&), а заодно и большинство других "нежелательных" символов. При данном методе "выжили" только кавычки ("), да и то непарные (парные кавычки в середине строк корректно реплицируются, а вот по краям строк "самоликвидируются", что тоже не очень хорошо). Остались также нерешенными проблемы репликации пустых строк и пробелов в начале строк (в т. ч. строк, состоящих из пробелов). Думаю их можно решить другими методами.

Код:

@ECHO OFF
SET File=My_File.txt
FOR /F "tokens=1* delims=:" %%I IN ('FINDSTR /N /R . %File%') DO ((
SET /P "VAR=%%J" 0>nul|FINDSTR DBXL>nul&&((SET /P "VAR=%%J" 0>nul&ECHO.&ECHO ;VSTAVKA)>>New_File.txt))||((SET /P "VAR=%%J" 0>nul&ECHO.)>>New_File.txt
))
REN %File% %File%.old&&REN New_File.txt %File%


icq99999999 28-07-2013 23:51 2192361

Цитата:

Цитата Iska
@echo off setlocal enableextensions enabledelayedexpansion set sFile=%~1 set sString4Find=DBXL set sString4Append=;VSTAVKA call :GetTemporaryName if defined sFile ( if exist "%sFile%" ( for /f "usebackq eol= delims=" %%i in ("%sFile%") do ( echo %%i| >nul find.exe "%sString4Find%" && ( >>"%TemporaryName%" echo %%i%sString4Append% ) || ( >>"%TemporaryName%" echo %%i ) ) if exist "%sFile%.bak" del /f /q "%sFile%.bak" ren "%sFile%" "%sFile%.bak" copy /y "%TemporaryName%" "%sFile%" del /f /q "%TemporaryName%" ) else ( echo Source file [%sFile%] not found. ) ) else ( echo Usage: %~nx0 ^<source file^> ) endlocal exit /b 0 rem ========================================================================== rem ========================================================================== rem Функция GetTemporaryName() rem rem Серый форум / CMD/BAT: генерация пути для временного файла или папки rem (http://forum.script-coding.com/viewtopic.php?id=6259) rem ========================================================================== :GetTemporaryName setlocal enableextensions enabledelayedexpansion :NextName set sTempName=%temp%\temp%random%.tmp if exist "%sTempName%" goto :NextName set sProcName=%~0 endlocal & set %sProcName:~4%=%sTempName% exit /b 0 rem ========================================================================== »

как добавить в начало всех строк определенный текст ?

Iska 29-07-2013 00:16 2192367

Код:

for /f "delims=" %%i in (0001.txt) do echo определенный текст%%i>>0002.txt
Пустые строки исчезнут.

icq99999999 30-07-2013 14:18 2193294

Цитата:

Цитата Iska
Код: »

имеется файл с таким таким содержанием (пример куска файла)
start /low C:\Windows\comencom.cmd
start /low "C:\Users\User\AppData\Roaming\uTorrent\uTorrent.exe" /MINIMIZED
start /low "C:\Program Files\Skype\Phone\Skype.exe" /minimized /regrun
а мне нужно так
ping -n 4 127.0.0.1 >nul
start /low C:\Windows\comencom.cmd
ping -n 4 127.0.0.1 >nul
start /low "C:\Users\User\AppData\Roaming\uTorrent\uTorrent.exe" /MINIMIZED
ping -n 4 127.0.0.1 >nul
start /low "C:\Program Files\Skype\Phone\Skype.exe" /minimized /regrun
притом строк будет очень много, эти я взял для примера.
то есть мне нужно чтобы перед каждой строкой была ping -n 4 127.0.0.1 >nul

Iska 30-07-2013 15:01 2193334

Код:

@echo off
setlocal enableextensions enabledelayedexpansion

>0002.txt (
        for /f "delims=" %%i in (0001.txt) do (
                echo ping.exe -n 4 127.0.0.1 ^>nul
                echo %%i
        )
)

endlocal
exit /b 0


icq99999999 30-07-2013 16:09 2193386

Цитата:

Цитата Iska
Код: »

как добавить в самое начало файла текст который содержит переход на другую строку
то есть по умолчании так
start /low C:\Windows\comencom.cmd
а мне нужно так
@echo off

start /low C:\Windows\comencom.cmd

Iska 30-07-2013 16:20 2193394

Код:

@echo off
setlocal enableextensions enabledelayedexpansion

>0002.txt (
        echo @echo off
        type 0001.txt
)

endlocal
exit /b 0

icq99999999, пользуйте тэг [code], дабы выглядело так:
читать дальше »
Цитата:

Цитата icq99999999
Как добавить в самое начало файла текст, который содержит переход на другую строку. То есть, по умолчанию так:
Код:

start /low C:\Windows\comencom.cmd
а мне нужно так:
Код:

@echo off
start /low C:\Windows\comencom.cmd

»


eggggggr 16-03-2017 01:47 2719848

Подскажите как написать файл который бы в текстовом документе (10гиг) через каждые 15 строк ставил пустую строку или символ-- помогите очень нужно!

Iska 16-03-2017 03:37 2719859

eggggggr, кодировка какая у текстового файла? Если юникод — то какой, и есть ли BOM? Концы строк в каком виде Windows, Unix, Mac?

Цитата:

Цитата eggggggr
пустую строку или символ »

Определитесь, что Вам нужно.


Время: 16:01.

Время: 16:01.
© OSzone.net 2001-