PDA

Показать полную графическую версию : [решено] Копирование\перенос строк с 1.txt до определённой строки\секции в 2.txt.


crimes
10-06-2013, 06:11
И так задача:

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

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

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

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



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

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

Foreigner
10-06-2013, 07:50
@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
Спасибо за ответ,но что то не работает,файл от win xp TXTSETUP.SIF.

Foreigner
10-06-2013, 19:19
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
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
Всем спасибо, всё работает.

Foreigner
11-06-2013, 06:53
Цитата 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
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




© OSzone.net 2001-2012