Ru-Board.club
← Вернуться в раздел «Microsoft Windows»

» Задачи на bat-файлах 10

Автор: ASE_DAG
Дата сообщения: 04.05.2011 20:21
Alexey87
Предлагаете скачать его с очередного говнообменника? Ладно.

> В файле c:\html\0125.html есть аж целых 12
И не одного не разорванного возвратом каретки и переводом строки, а Греп-тот читает файл построчно.
На свое удивление не нашел у него ключа, задающего произвольный символ — разделитель записей, поэтому могу только преложить предварительно потереть эти символы:
$ awk -v RS='\r\n' -v ORS=' ' '1' /tmp/0125.html.utf-8 | grep -Pio '<h[1-6].*?>.*?</h[1-6]>'
<h1 id="fav_name_1" class="news_item_header">Всемирный день IPv6: мир движется к новой версии интернет-протокола</h1>
<h1 id="fav_name_1" class="news_item_header">Мультимедиа: DarkWave Studio v.3.2.6</h1>
<h1 id="fav_name_1" class="news_item_header">Чистильщики: Driver Sweeper v.2.8.5</h1>
<h1 id="fav_name_1" class="news_item_header">Почтовые клиенты и фильтры: Gmail Manager v.0.6.3</h1>
<h1 id="fav_name_1" class="news_item_header">Настройщики: GBoost v.1.03.0</h1>
<h1 id="fav_name_1" class="news_item_header">Чистильщики: Norton Removal Tool 2011.0.5.9</h1>
<h1 id="fav_name_1" class="news_item_header">Утилиты: PDFCreator v.1.2.0</h1>
<h1 id="fav_name_1" class="news_item_header">Мультимедиа: VideoLAN v.1.1.6</h1>
<h1 id="fav_name_1" class="news_item_header">Диагностика: Gigabyte EasyTune6 v.B10.1228.1</h1>
<h1 id="fav_name_1" class="news_item_header">SearchInform о прогнозах в области информационной безопасности на 2011 год</h1>
<h1 id="fav_name_1" class="news_item_header">OPTIMA-WorkFlow и iDecide — управление бизнес-процессами на iPad</h1>
<h1 id="fav_name_1" class="news_item_header">Российским врачам будет ассистировать iPad</h1>

— вот как-то так это выглядит у меня.
Автор: Alexey87
Дата сообщения: 04.05.2011 21:43
ASE_DAG, большое спасибо!
вроде заработало (в командной строке пробегает сканирование заголовков), но информация не сохраняется в txt-файл.
Вместо этого по завершению операции в txt-файле запись:

Цитата:
Режим вывода команд на экран (ECHO) отключен

Автор: ASE_DAG
Дата сообщения: 04.05.2011 21:48
Alexey87
> большое спасибо!
> вроде заработало
Я аж удивлен. :)

Так что у вас заработало? Опять вижу от вас только какие-то слова вместо вашего ввода и машинного вывода.

> в командной строке пробегает сканирование заголовков
Чавой?
Автор: Alexey87
Дата сообщения: 05.05.2011 09:15

Цитата:
> в командной строке пробегает сканирование заголовков
Чавой?

я хотел сказать появляется следующее:

а когда запускаю bat-файл с кодом:

Цитата:
@echo off
setlocal
pushd "C:\html"
for %%i in (*.html) do (
grep.exe -Pio ^<h[1-2].*?^>.*?^</h[1-2]^> c:\html\0125.html
)
popd
echo %title% >> c:\out.txt

то информация не сохраняется в txt-файл.
Вместо этого по завершению операции в txt-файле запись:

Цитата:
Режим вывода команд на экран (ECHO) отключен
Автор: wolf0425
Дата сообщения: 05.05.2011 09:39

Цитата:
то информация не сохраняется в txt-файл.
Вместо этого по завершению операции в txt-файле запись:
неудивительно - у тебя же не определена переменная %title%, содержимое которой ты просишь напечатать (с перенаправлением)

ты наверно это хотел написать:
Код: @echo off
setlocal
pushd "C:\html"
for %%i in (*.html) do (
1>>c:\out.txt grep.exe -Pio ^<h[1-2].*?^>.*?^</h[1-2]^> %%i
)
popd
Автор: Alexey87
Дата сообщения: 05.05.2011 11:56
wolf0425, при запуске bat-файл с кодом:

Цитата:
@echo off
setlocal
pushd "C:\html"
for %%i in (*.html) do (
c:\sed\sed.exe -n -r "/<h[1-6]/ {N;s/\n/ /gi;s/^.*(<h[1-6][^>]*>[^<]*<\/h[1-6]>).*$/\1/gip}" <c:\html\0125.html >c:\out.txt
c:\sed\sed.exe -n -r "/<h[1-6]/ {N;s/\n/ /gi;s/^.*(<h[1-6][^>]*>[^<]*<\/h[1-6]>).*$/\1/gip}" <c:\html\0126.html >c:\out.txt
)
popd

в файле out.txt сохраняется данные только последнего файла, т.е. 0126.html
как сделать так, чтобы собиралась информация со всех html-файлов в файл out.txt?
Автор: Bezzz
Дата сообщения: 05.05.2011 12:05

Цитата:
как сделать так, чтобы собиралась информация со всех html-файлов в файл out.txt?

Вместо >c:\out.txt набрать >>c:\out.txt
Автор: wolf0425
Дата сообщения: 05.05.2011 12:10

Цитата:
как сделать так, чтобы собиралась информация со всех html-файлов в файл out.txt?
писать >>c:\out.txt

и объясни мне - из каких соображений ты делаешь этот цикл for если никак не используешь переменную цикла и указываешь седу имена файлов явно?
Оно же работать будет явно не так как ты хочешь и пример с грепом в таком цикле я же не зря выше писал поправленный...

похоже что всё что ты хочешь - делается в одну строку:
Код: type "C:\html\*.html" | sed.exe -n -r "/<h[1-6]/ {N;s/\n/ /gi;s/^.*(<h[1-6][^>]*>[^<]*<\/h[1-6]>).*$/\1/gip}" >c:\out.txt
Автор: Alexey87
Дата сообщения: 05.05.2011 15:12
Уважаемые форумчане, благодарю всех за помощь кто участвовал в решении следующего вопроса:

Цитата:
есть html-документы (около 1000), нужно извлечь все заголовки (тег h) например в txt-файл.
Возможно ли это реализовать с помощью bat-файла? Если да, то как?

Извлечение заголовков из html-файлов совершилось!
Еще раз ОГРОМНЕЙШЕЕ СПАСИБО
Автор: king_stiven
Дата сообщения: 05.05.2011 15:14
Печатать часть файла между двумя регулярными выражениями (включительно):
sed -n "/Iowa/,/Montana/p" (регистро зависимый)

Но если текст такой:

Iowa
...
Iowa
...
Montana

то мне требуется взять вот эту часть:

Iowa
...
Montana

а сед берёт

Iowa
...
Iowa
...
Montana

как сделать по моему? Текст идёт с выхода вгета без сохранения на файл.

Автор: NIKZZZZ
Дата сообщения: 05.05.2011 16:24
king_stiven
С регулярками , поставь себе RegexBuddy и отлаживай.

Цитата:
Печатать часть файла между двумя регулярными выражениями

Нет, нужно регулярное выражение, которое это и сделает, все , что не подходит под шаблон недоступно.

Автор: ASE_DAG
Дата сообщения: 05.05.2011 16:42
king_stiven
Так это принципиальное ограничение обработки потока «на лету» построчно. Начиная выводить строки, Сед еще понятия не имеет о том, что там дальше по потоку.
Здесь два принципиальных разных подхода к решению: 1) обрабатывать за раз запись заведомо большую, чем искомый блок текста (так мы поступили выше, при выводе HTML-заголовков); 2) выводить результат только по завершении обработки потока.

Второй вариант почти в любом случае более предпочтителен, им и воспользуемся:

$ cat king_stiven.txt
Ququ.
Iowa.
Non-desired line
Iowa.
Desired line 1
Desired line 2
Desired line 3
Montana.
Blah-blah.


[no]$ awk '/Iowa/{delete s; p=1} p==1{s[FNR]=$0} /Montana/{exit 0} END{for (i in s) print s[i]}' king_stiven.txt[/no]
Iowa.
Desired line 1
Desired line 2
Desired line 3
Montana.


(вы не указали, что делать, если закрывающее слово встречается неоднократно, я, как видно выше, предположил, что закрыть вывод надо первым из таковых)

P.S. На будущее: с вопросами чисто по неинтерактивной обработке текста лучше обращаться в профильную тему: UNIX Shell: sh, bash, zsh; Coreutils и ко.; sed, awk, perl; ;)
Автор: 01MDM
Дата сообщения: 05.05.2011 16:48
ASE_DAG
Чем она профильней этой?
Автор: ASE_DAG
Дата сообщения: 05.05.2011 17:22
01MDM
> Чем она профильней этой?

Цитата:
UNIX Shell: sh, bash, zsh; Coreutils и ко.; sed, awk, perl;



Цитата:
Неинтерактивная обработка текста (sed, awk, perl) пока тоже здесь.


;)
Автор: ASE_DAG
Дата сообщения: 05.05.2011 18:06
wolf0425
> если однократно - сказать седу чтоб удалил всё до Iowa и всё после Montana, остаток - то что тебе надо.
Нет, это полный эквивалент /Iowa/,/Montana/p, а не то, что надо. ;)
Ну вот, вы уже и затерли. :)
Автор: 01MDM
Дата сообщения: 05.05.2011 18:12
Вопрос, как сохранить первое вхождение "Montana"

Код:
sed -e "1,/Iowa/d" -e "/Montana/,$d" file.txt
Автор: ASE_DAG
Дата сообщения: 05.05.2011 18:26
01MDM
> как сохранить первое вхождение "Montana"
Но выкинуть первое вхождение для «Iowa»? В связи с чем, собственно, вопрос?
Автор: 01MDM
Дата сообщения: 05.05.2011 19:20
ASE_DAG

Цитата:
Но выкинуть первое вхождение для «Iowa»? В связи с чем, собственно, вопрос?

А зачем по условию оставлять первое вхождение Iowa если оно не последнее? Вопрос как оставить первое после Iowa вхождение Montana. Например:

Код:
Iowa
1234
5678
Iowa

Iowa
0000
1111
2222
3333
Montana

1234
5678
Montana
Montana
1234

Автор: ASE_DAG
Дата сообщения: 05.05.2011 19:38
01MDM
> Вопрос как оставить первое после Iowa вхождение Montana.
Вам это принципиально интересно, или вы считаете, что это отделяет вас от решения задачи т-ща king_stiven?
Если второе, то я же выше все написал, в т.ч. и про это.
Автор: king_stiven
Дата сообщения: 05.05.2011 19:47
01MDM

Цитата:
sed -e "1,/Iowa/d" -e "/Montana/,$d" file.txt

Для текста

Iowa ... Montana
...
Montana

он берёт вот этот интервал
...
Montana
вместо правильного
Iowa ... Montana

но уже что то намечается, текст может быть любым, но мне нужно, чтоб между
Iowa и Montana не было других Iowa и Montana
Правильно:
Iowa апрапра Montana
Неправильно:
Iowa апрапра Iowa Montana
Текст нужный может быть как в одну строку, так и в несколько строк.
Автор: ASE_DAG
Дата сообщения: 05.05.2011 19:54
king_stiven
Мой ответ вы не заметили?

> но уже что то намечается
Ничего здесь не намечается, это почти полный эквивалент тому, что у вас было изначально.
Автор: 01MDM
Дата сообщения: 05.05.2011 20:02
ASE_DAG

Цитата:
или вы считаете, что это отделяет вас от решения задачи т-ща king_stiven?

Я думаю он и сам справится, просто мне показалось нелогичным:

1: "1,/Iowa/d" -- оставляет последнюю строку в этом адресном пространстве

2: "/Montana/,$d" -- удаляет последнюю строку

Автор: king_stiven
Дата сообщения: 05.05.2011 20:02
ASE_DAG
У меня винда
Автор: ASE_DAG
Дата сообщения: 05.05.2011 20:03
> Текст нужный может быть как в одну строку, так и в несколько строк.
А вот это, все-таки, стоило указать сразу. Однако в данном случае , то, что я привел выше, корректно отработает в обоих случаях.

Добавлено:
> У меня винда
Спасибо, я догадался. Вы это вообще к чему?

01MDM
> Я думаю он и сам справится
А мне почему-то думается, что если он обратился сюда, то сам не справился.

> просто мне показалось нелогичным:
> 1: "1,/Iowa/d" -- оставляет последнюю строку в этом адресном пространстве
> 2: "/Montana/,$d" -- удаляет последнюю строку
Нет, здесь все очень логично. Все строки с 1 по /Iowa/ включительно в первом случае и с /Montana/ по последнюю включительно будут удалены.
Автор: king_stiven
Дата сообщения: 05.05.2011 20:25
sed -n "/Iowa/,/Montana/p
А вот зачем sed выводит этот текст, пропуская первое вхождение в Montana и останавливаясь только на втором

Iowa ... Montana
...
Montana

вообще непонятно...
А можно седом склеить строки в одну строку? То есть
sed -n "/Iowa/,/Montana/p" | sed "тут клим всё в одну строку"
Автор: 01MDM
Дата сообщения: 05.05.2011 20:35
ASE_DAG

Цитата:

Нет, здесь все очень логично. Все строки с 1 по /Iowa/ включительно в первом случае и с /Montana/ по последнюю включительно будут удалены.

Еще раз:
1: "1,/Iowa/d" -- оставляет Iowa
2: "/Montana/,$d" -- удаляет все

Вот это мне и не понятно. Хотя в файле:

Код:
1
2
3
4
5
Автор: ASE_DAG
Дата сообщения: 05.05.2011 20:36
king_stiven
> А вот зачем sed...
А вот так. a,b — это предполагается именно диапазон строк.

Вы разобрались с решением, которое я вам расписал?

Добавлено:
01MDM
> "1,/Iowa/d" -- оставляет Iowa
Где он ее оставляет?

$ cat king_stiven.txt
Ququ.
Iowa.
Non-desired line
Iowa.
Desired line 1
Iowa. Desired line 2 Montana.
Desired line 3
Montana.


$ sed '1,/Iowa/d' king_stiven.txt
Non-desired line
Iowa.
Desired line 1
Iowa. Desired line 2 Montana.
Desired line 3
Montana.
Blah-blah.


Как видите, строки удаляются включительно.

Если еще будут не связанные с конкретной задачей вопросы, давайте их обсуждать в другой теме, а то мы сейчас т-ща king_stiven окончательно запутаем. :)
Автор: king_stiven
Дата сообщения: 05.05.2011 20:42
01MDM
А мне надо вывести
1
2
3
ASE_DAG
Нет, это надо что то устанавливать? Мне хотя б с седом разобратьсчя
Автор: ASE_DAG
Дата сообщения: 05.05.2011 20:49
king_stiven
> это надо что то устанавливать?
Да, awk. Сед же установили.

> Мне хотя б с седом разобратьсчя
А что с ним разбираться? У вас же конкретная задача стояла.
Автор: king_stiven
Дата сообщения: 05.05.2011 21:15
Попробую использовать конструкцию
for /f "delims=" %%q in ('sed -n "/Iowa/,/Montana/p" 10.htm"') do (
и построчно разобрать , что к чему.

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071

Предыдущая тема: зависает установка Windows XP: 39 минут


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.