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

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Копирование\перенос строк с 1.txt до определённой строки\секции в 2.txt. (http://forum.oszone.net/showthread.php?t=262173)

crimes 10-06-2013 06:11 2165177

Копирование\перенос строк с 1.txt до определённой строки\секции в 2.txt.
 
И так задача:

Необходимо с файла TXTSETUP1.txt вырезать все строки до секции [BootBusExtenders.Load] в TXTSETUP2.txt

В общем итоге мне нужно:

С файла TXTSETUP1.txt до секции [BootBusExtenders.Load] перенесло всё в TXTSETUP2.txt а в TXTSETUP1.txt все осталось начиная с секции [BootBusExtenders.Load] .

Ну как бы разбить их по определённой секции или строке\слову.



Нумерация не покатит та свыше 5000 строк и они меняются.

За ранние всем спасибо.

Foreigner 10-06-2013 07:50 2165196

Код:

@echo off
setlocal

set "file=TXTSETUP1.tmp"
for /f "tokens=1,2 delims=:" %%i in ('findstr /n "^"  TXTSETUP1.txt') do call:1 %%i "%%j"

for %%i in (*.tmp) do move /y %%i %%~ni.txt
goto:eof

:1

if %2=="[BootBusExtenders.Load]" set file=TXTSETUP2.tmp

1>>%file% (

    if %2=="" (echo.) else (echo %~2)

)


crimes 10-06-2013 09:27 2165219

Спасибо за ответ,но что то не работает,файл от win xp TXTSETUP.SIF.

Foreigner 10-06-2013 19:19 2165464

crimes,
Батники не совсем подходят для таких задач (работа с текстом). Варианты на PowerShell:
Код:

$a = gc .\TXTSETUP.SIF
$file = ".\1.txt"

$a | % {

    if ($_ -eq "[BootBusExtenders.Load]") { $file = ".\2.txt" }
    add-content $file $_

}

Вариант побыстрей:
Код:

$a = gc .\TXTSETUP.SIF

for ($i = 0; $i -le ($a.count-1); $i++ ) {

    if ($a[$i] -eq "[BootBusExtenders.Load]") { $ind = $i; break }
   
}

set-content .\1.txt $a[0..($ind-1)]   
set-content .\2.txt $a[$ind..($a.count-1)]

С помощью sed:
Код:

@echo off
setlocal

for /f %%i in ('sed -n "/\[BootBusExtenders\.Load\]/ =" TXTSETUP.SIF') do set "str=%%i"

sed -n "%str%,$ p" TXTSETUP.SIF > 2.txt
set /a str-=1
sed -n "1,%str% p" TXTSETUP.SIF > 1.txt


Georgio 10-06-2013 20:55 2165507

BAT-файл.

Код:

@ECHO OFF
FOR /F "tokens=1 delims=:" %%I IN ('FINDSTR /N /L [BootBusExtenders.Load]^<TXTSETUP1.SIF') DO (
 SET VAR1=%%I
)
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /F "tokens=1* delims=]" %%I IN ('FIND /N /V ""^<TXTSETUP1.SIF') DO (
    SET VAR2=%%I
    SET VAR3=!VAR2:~1!
    SET VAR4=%%J
    IF !VAR3! LSS %VAR1% (
    IF DEFINED VAR4 (
      SET /P VAR5="%%J" 0>nul 1>>TXTSETUP2.SIF
      ECHO.>>TXTSETUP2.SIF
  ) ELSE (
      ECHO.>>TXTSETUP2.SIF
 )) ELSE (
    IF DEFINED VAR4 (
      SET /P VAR5="%%J" 0>nul 1>>temp.txt
      ECHO.>>temp.txt
  ) ELSE (
      ECHO.>>temp.txt
)))
MOVE temp.txt TXTSETUP1.SIF
ECHO All's ready! Press any key to exit.
PAUSE>nul


crimes 11-06-2013 02:00 2165641

Всем спасибо, всё работает.

Foreigner 11-06-2013 06:53 2165657

Цитата crimes:
Цитата:

всё работает.
И все корректно работает? И нигде не проглатывает восклицательные знаки?

Код:

[DiskDriverMap]
abiosdsk = "%1 МБ диск Micro Channel"
atdisk  = "%1 МБ диск IDE/ESDI"
disk    = "%1 МБ диск %2 ID %3 шина %4 на %5"

Код:

[DiskDriverMap]
abiosdsk = "%1!u! МБ диск Micro Channel"
atdisk  = "%1!u! МБ диск IDE/ESDI"
disk    = "%1!u! МБ диск %2!u! ID %3!u! шина %4!u! на %5"


Georgio 11-06-2013 14:42 2165879

BAT-файл №2.

Код:

@ECHO OFF
FOR /F "tokens=1 delims=:" %%I IN ('FINDSTR /N /L [BootBusExtenders.Load]^<TXTSETUP1.SIF') DO (
 SET /A VAR1=%%I
)
FOR /F "tokens=*" %%I IN ('FIND /N /V ""^<TXTSETUP1.SIF') DO (
 FOR /F "tokens=1* delims=[]" %%J IN ("%%I") DO (
  IF %%J LSS %VAR1% (
    IF NOT %%I==[%%J]%%K (
    SET /P VAR2="[%%K" 0>nul 1>>TXTSETUP2.SIF
      ECHO.>>TXTSETUP2.SIF
  ) ELSE (
    SET /P VAR2="%%K" 0>nul 1>>TXTSETUP2.SIF
    ECHO.>>TXTSETUP2.SIF
)) ELSE (
    IF NOT %%I==[%%J]%%K (
    SET /P VAR2="[%%K" 0>nul 1>>temp.txt
    ECHO.>>temp.txt
  ) ELSE (
    SET /P VAR2="%%K" 0>nul 1>>temp.txt
    ECHO.>>temp.txt
))))
MOVE temp.txt TXTSETUP1.SIF
ECHO All's ready! Press any key to exit.
PAUSE>nul



Время: 10:27.

Время: 10:27.
© OSzone.net 2001-