Компьютерный форум 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=311750)

Alexander_88 18-02-2016 13:57 2607493

Скопировать часть блоков из одного текстового файла в другой
 
Здравствуйте, подскажите, пожалуйста, как можно скопировать определенную часть блоков текстового документа и вставить их в другой тхт файл? Чтобы скрипт понял какую часть блоков тхт документа копировать, я должен буду в файле скрипта указать "начальную" и "конечную" фразы. Скрипт должен будет скопировать все блоки от начальной до конечной фразы и вставить их в другой тхт файл. Блоком считается текст и нижний разделитель (верхний разделитель и все, что выше, не входит в текущий блок).

Пример:

Пусть исходный файл posts.txt такой:

Код:

<subject>Video films</subject>
<center><img class="size-full" src="http://mysite.com/wp-content/uploads/0001start-cover.jpg" alt="Video films" />
avi | 0:15:44 | 640x480 | 120Mb
<!--more-->
<categories>terminator (fantastika)</categories>
<tags>tag1, tag2, tag3</tags>
<img class="size-full" src="http://mysite.com/wp-content/uploads/0001start-tumble.jpg" alt="Video films" />
<blockquote><a href="http://k2s.cc/file/dd5ddk87609aa8c40/0001start.wmv" target="_blank">Video films</a></blockquote></center>
------------------------------------------------------------
<subject>Boevik</subject>
<center><img class="size-full" src="http://mysite.com/wp-content/uploads/0002start-cover.jpg" alt="Boevik" />
avi | 0:35:44 | 640x480 | 120Mb
<!--more-->
<categories>Comedi 1987</categories>
<tags>tag1, tag2, tag3</tags>
<img class="size-full" src="http://mysite.com/wp-content/uploads/0002start-tumble.jpg" alt="Boevik" />
<blockquote><a href="http://k2s.cc/file/dd5ddkuiyi559aa8c40/0002start.wmv" target="_blank">Boevik</a></blockquote></center>
------------------------------------------------------------
<subject>Serial nash</subject>
<center><img class="size-full" src="http://mysite.com/wp-content/uploads/0003start-cover.jpg" alt="Serial nash" />
wmv | 0:41:48 | 640x480 | 120Mb
<!--more-->
<categories>terminator (fantastika)</categories>
<tags>tag1, tag2, tag3</tags>
<img class="size-full" src="http://mysite.com/wp-content/uploads/0003start-tumble.jpg" alt="Serial nash" />
<blockquote><a href="http://k2s.cc/file/dd5ddkdfgf59aa8c40/0003start.wmv" target="_blank">Serial nash</a></blockquote></center>
------------------------------------------------------------

Пусть начальная фраза 0001start
Пусть конечная фраза 0002start

после выполнения скрипта должен появиться файл posts2.txt с содержимым:

Код:

<subject>Video films</subject>
<center><img class="size-full" src="http://mysite.com/wp-content/uploads/0001start-cover.jpg" alt="Video films" />
avi | 0:15:44 | 640x480 | 120Mb
<!--more-->
<categories>terminator (fantastika)</categories>
<tags>tag1, tag2, tag3</tags>
<img class="size-full" src="http://mysite.com/wp-content/uploads/0001start-tumble.jpg" alt="Video films" />
<blockquote><a href="http://k2s.cc/file/dd5ddk87609aa8c40/0001start.wmv" target="_blank">Video films</a></blockquote></center>
------------------------------------------------------------
<subject>Boevik</subject>
<center><img class="size-full" src="http://mysite.com/wp-content/uploads/0002start-cover.jpg" alt="Boevik" />
avi | 0:35:44 | 640x480 | 120Mb
<!--more-->
<categories>Comedi 1987</categories>
<tags>tag1, tag2, tag3</tags>
<img class="size-full" src="http://mysite.com/wp-content/uploads/0002start-tumble.jpg" alt="Boevik" />
<blockquote><a href="http://k2s.cc/file/dd5ddkuiyi559aa8c40/0002start.wmv" target="_blank">Boevik</a></blockquote></center>
------------------------------------------------------------

Примечание:
Блоков много.
Одна и та же фраза (хоть начальная, хоть конечная) точно не будет находиться в двух блоках одновременно.
:)

greg zakharov 18-02-2016 16:23 2607568

А какой смысл писать что-то вроде "000Xstart"? Если следовать логике регулярных выражений достаточно указать числа для шаблона подобного "[X|Y]start", относительно чего в свою очередь ищем индексы строк, из которых составляется диапазон блока. Иными словами, если наш текст:
Код:

<subject>Video films</subject>
<center><img class="size-full" src="http://mysite.com/wp-content/uploads/0001start-cover.jpg" alt="Video films" />
avi | 0:15:44 | 640x480 | 120Mb
<!--more-->
<categories>terminator (fantastika)</categories>
<tags>tag1, tag2, tag3</tags>
<img class="size-full" src="http://mysite.com/wp-content/uploads/0001start-tumble.jpg" alt="Video films" />
<blockquote><a href="http://k2s.cc/file/dd5ddk87609aa8c40/0001start.wmv" target="_blank">Video films</a></blockquote></center>
------------------------------------------------------------
<subject>Boevik</subject>
<center><img class="size-full" src="http://mysite.com/wp-content/uploads/0002start-cover.jpg" alt="Boevik" />
avi | 0:35:44 | 640x480 | 120Mb
<!--more-->
<categories>Comedi 1987</categories>
<tags>tag1, tag2, tag3</tags>
<img class="size-full" src="http://mysite.com/wp-content/uploads/0002start-tumble.jpg" alt="Boevik" />
<blockquote><a href="http://k2s.cc/file/dd5ddkuiyi559aa8c40/0002start.wmv" target="_blank">Boevik</a></blockquote></center>
------------------------------------------------------------
<subject>Serial nash</subject>
<center><img class="size-full" src="http://mysite.com/wp-content/uploads/0003start-cover.jpg" alt="Serial nash" />
wmv | 0:41:48 | 640x480 | 120Mb
<!--more-->
<categories>terminator (fantastika)</categories>
<tags>tag1, tag2, tag3</tags>
<img class="size-full" src="http://mysite.com/wp-content/uploads/0003start-tumble.jpg" alt="Serial nash" />
<blockquote><a href="http://k2s.cc/file/dd5ddkdfgf59aa8c40/0003start.wmv" target="_blank">Serial nash</a></blockquote></center>
------------------------------------------------------------

То:
Код:

param(
  [Parameter(Mandatory=$true, Position=0)]
  [ValidateScript({Test-Path $_})]
  [String]$FileName,
 
  [Parameter(Mandatory=$false)]
  [Int32]$Begin = 1,
 
  [Parameter(Mandatory=$true, Position=1)]
  [Int32]$End
)

$FileName = Convert-Path $FileName
if ($Begin -gt $End) {
  Write-Warning "index is out of range."
  break
}

$$ = Select-String $FileName -Pattern (
  '[{0:D4}|{1:D4}]start.wmv' -f $Begin, $End
) | Select-Object LineNumber
$top = $$[0].LineNumber - 8
$end = $$[1].LineNumber + 1

Select-String $FileName -Pattern "^" |
Where-Object {$_.LineNumber -gt $top -and $_.LineNumber -le $end} |
Select-Object Line -ExpandProperty Line |
Out-File out.txt -Encoding ASCII

И далее:
Код:

PS E:\sandbox> .\source.ps1 D:\test\myfile.txt -Begin 2 -End 3
Получим в папке E:\sandbox файл out.txt следующего содержания:
Код:

<subject>Boevik</subject>
<center><img class="size-full" src="http://mysite.com/wp-content/uploads/0002start-cover.jpg" alt="Boevik" />
avi | 0:35:44 | 640x480 | 120Mb
<!--more-->
<categories>Comedi 1987</categories>
<tags>tag1, tag2, tag3</tags>
<img class="size-full" src="http://mysite.com/wp-content/uploads/0002start-tumble.jpg" alt="Boevik" />
<blockquote><a href="http://k2s.cc/file/dd5ddkuiyi559aa8c40/0002start.wmv" target="_blank">Boevik</a></blockquote></center>
------------------------------------------------------------
<subject>Serial nash</subject>
<center><img class="size-full" src="http://mysite.com/wp-content/uploads/0003start-cover.jpg" alt="Serial nash" />
wmv | 0:41:48 | 640x480 | 120Mb
<!--more-->
<categories>terminator (fantastika)</categories>
<tags>tag1, tag2, tag3</tags>
<img class="size-full" src="http://mysite.com/wp-content/uploads/0003start-tumble.jpg" alt="Serial nash" />
<blockquote><a href="http://k2s.cc/file/dd5ddkdfgf59aa8c40/0003start.wmv" target="_blank">Serial nash</a></blockquote></center>
------------------------------------------------------------

Чтобы данные считываль с самого начала:
Код:

PS E:\sandbox> .\source.ps1 D:\test\myfile.txt -End 2
Получим:
Код:

<subject>Video films</subject>
<center><img class="size-full" src="http://mysite.com/wp-content/uploads/0001start-cover.jpg" alt="Video films" />
avi | 0:15:44 | 640x480 | 120Mb
<!--more-->
<categories>terminator (fantastika)</categories>
<tags>tag1, tag2, tag3</tags>
<img class="size-full" src="http://mysite.com/wp-content/uploads/0001start-tumble.jpg" alt="Video films" />
<blockquote><a href="http://k2s.cc/file/dd5ddk87609aa8c40/0001start.wmv" target="_blank">Video films</a></blockquote></center>
------------------------------------------------------------
<subject>Boevik</subject>
<center><img class="size-full" src="http://mysite.com/wp-content/uploads/0002start-cover.jpg" alt="Boevik" />
avi | 0:35:44 | 640x480 | 120Mb
<!--more-->
<categories>Comedi 1987</categories>
<tags>tag1, tag2, tag3</tags>
<img class="size-full" src="http://mysite.com/wp-content/uploads/0002start-tumble.jpg" alt="Boevik" />
<blockquote><a href="http://k2s.cc/file/dd5ddkuiyi559aa8c40/0002start.wmv" target="_blank">Boevik</a></blockquote></center>
------------------------------------------------------------


Alexander_88 19-02-2016 04:56 2607749

Спасибо, получилось одиночно запустить файл с основным кодом и выполнить. А куда нужно второй маленький код вписывать? в отдельный файл?
Я сделал отдельный файл: 1.ps1

Код:

PS "C:\WORK\video films"> .\diapazon.ps1 posts.txt -Begin 2 -End 3
и запускаю его. В итоге очищается файл diapazon.ps1 (это файл с основным кодом) и все :)

greg zakharov 19-02-2016 09:15 2607767

Alexander_88, вообще-то:
Код:

PS E:\sandbox> .\source.ps1 D:\test\myfile.txt -Begin 2 -End 3
пример запуска сценария в хосте PowerShell.

Alexander_88 19-02-2016 14:59 2607942

спасибо, наконец - то получилось, с помощью бат файла параметры передал в скрипт :)


Время: 04:38.

Время: 04:38.
© OSzone.net 2001-