Модераторы: ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> К последнему элементу $3 левое захватывается, Бажит регулярка, прошу помочь 
V
    Опции темы
EvilsInterrupt
Дата 16.3.2010, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: нет
Всего: 9



Цитата

\\?\UNC\root\folder1\folder2\file.txt1    ok    ok    ok
\\?\UNC\root\folder1\folder3\file.tx    diff    ok    ok


мне надо обработать все строки имеющие diff .
решил разбить подобную строку так:

Код

/^\\\\\?\\UNC\\root\\(.+?)\t(.+?)\t(.+?)\t(.+?)/


где:
$1 - это путь
$2 - статус
$3, $4 - это строка1 и строка2

имеется след. код:
Код

    while(<LOG>)
    {
        chomp;
        
        if/^\\\\\?\\UNC\\root\\(.+?)\t(.+?)\t(.+?)\t(.+?)/)
        {
            #printf "path:       $1\n";
            #printf "status:     $2\n";
            #printf "string #1: $3\n";
            #printf "string #2: $4\n";
        }
    }

под отладчиком в Komodo окне watch вижу, что к $3 приаттачивается другая строка, а мне этого не надо!

Как это решить? выделить исключительно одну?


Это сообщение отредактировал(а) EvilsInterrupt - 16.3.2010, 19:25
PM MAIL WWW ICQ Jabber   Вверх
dva300
Дата 16.3.2010, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 17.2.2010
Где: Москва

Репутация: 2
Всего: 1



Цитата(EvilsInterrupt @ 16.3.2010,  19:24)
Цитата

\\?\UNC\root\folder1\folder2\file.txt1    ok    ok    ok
\\?\UNC\root\folder1\folder3\file.tx    diff    ok    ok


мне надо обработать все строки имеющие diff .
решил разбить подобную строку так:

Код

/^\\\\\?\\UNC\\root\\(.+?)\t(.+?)\t(.+?)\t(.+?)/


где:
$1 - это путь
$2 - статус
$3, $4 - это строка1 и строка2

имеется след. код:
Код

    while(<LOG>)
    {
        chomp;
        
        if/^\\\\\?\\UNC\\root\\(.+?)\t(.+?)\t(.+?)\t(.+?)/)
        {
            #printf "path:       $1\n";
            #printf "status:     $2\n";
            #printf "string #1: $3\n";
            #printf "string #2: $4\n";
        }
    }

под отладчиком в Komodo окне watch вижу, что к $3 приаттачивается другая строка, а мне этого не надо!

Как это решить? выделить исключительно одну?

а $4 пустая ?
тогда между последними ok и ok не табуляция \t а пробелы \s
--------------------
Участник движения Культура Вождения
PM   Вверх
EvilsInterrupt
Дата 16.3.2010, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: нет
Всего: 9



dva300, 
привел не ту регулярку, извиняюсь! На самом деле вот с чем вожусь:
Код

if/^\\\\\?\\UNC\\root\\(.+?)\t(.+?)\t(.+?)\t(.+)$/)

и вот в этом месте-то и есть захват следующей строки!

>>тогда между последними ok и ok не табуляция \t а пробелы \s 
Между ними байт 09, что означает табуляцию и завершается строка 0D, т.е. символом новой строки!

ЗЫ:
Я новичок в PERL,логи огромные и не хочу ручками ;))) Прошу помочь, очень надо!
PM MAIL WWW ICQ Jabber   Вверх
dva300
Дата 16.3.2010, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 17.2.2010
Где: Москва

Репутация: 2
Всего: 1



Цитата(EvilsInterrupt @ 16.3.2010,  19:51)
dva300, 
привел не ту регулярку, извиняюсь! На самом деле вот с чем вожусь:
Код

if/^\\\\\?\\UNC\\root\\(.+?)\t(.+?)\t(.+?)\t(.+)$/)

и вот в этом месте-то и есть захват следующей строки!

>>тогда между последними ok и ok не табуляция \t а пробелы \s 
Между ними байт 09, что означает табуляцию и завершается строка 0D, т.е. символом новой строки!

ЗЫ:
Я новичок в PERL,логи огромные и не хочу ручками ;))) Прошу помочь, очень надо!

покажи кусок лога 

P.S. какой же ты новичек - написано же - опытный smile 

--------------------
Участник движения Культура Вождения
PM   Вверх
shamber
Дата 17.3.2010, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: нет
Всего: 18



dva300, опытный статус на форуме smile но никак не относительно знаний в той или иной области
PM MAIL Jabber   Вверх
arto
Дата 17.3.2010, 08:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: нет
Всего: 40



"опытный пользователь форума"?
PM MAIL ICQ   Вверх
EvilsInterrupt
Дата 17.3.2010, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: нет
Всего: 9



Пообщавшись вчера с dva300 пришли к выводу, что проблема заключена в трактовке символа новой строки, под никсы это 0x0D, т.е. CR , а под винды это 0x0D, 0x0A, т.е. CR LF .
Но лог у меня от никсовых прог, а вот обрабатываю на винде ! ;) Как вывод функциия chomp может не корректно удалять символ.

Вопрос:
Как быть ?

Приведу, еще раз что у меня есть:
Цитата

\\?\UNC\root\folder1\folder2\file.txt1    ok    ok    ok
\\?\UNC\root\folder1\folder3\file.tx    diff    ok    ok


и:
Код

    while(<LOG>)
    {
        chomp;
        
        if(/^\\\\\?\\UNC\\root\\(.+?)\t(.+?)\t(.+?)\t(.+)$/)
        {
            #printf "path:       $1\n";
            #printf "status:     $2\n";
            #printf "string #1: $3\n";
            #printf "string #2: $4\n";
        }
    }


Нужно отлавливать те строки, где статус равен diff, а стринг 1 и стринг 2 могут иметь различные значения и закладываться на "ок" или чтото еще не надо! Стринги 1 и 2 и статус, а также путь разделены символом табуляции!

Моя цель отловить строки с diff и расчленить на составлящие такую строку!

ЗЫ:
После решения этой задачи, встанет задача "как найти в этой строке под строку X разделенную символами \, т.е. слыш". Но это потом ! ;) Хотя кто может может уже приводить решение, буду только рад! ;)


ЗЫ 2:
>>dva300, опытный статус на форуме  но никак не относительно знаний в той или иной области 
В точку! То что много балов, еще не говорит о знаниях! быть может человек набрал их в другой области, к примеру по С++ или задавая вопросы. Мое мнение, судить о человеке можно только о респектах, причем по реально толковым ответам, а не "Отлично побухали" или еще чтото в этом роде!
PM MAIL WWW ICQ Jabber   Вверх
dva300
Дата 17.3.2010, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 17.2.2010
Где: Москва

Репутация: 2
Всего: 1



Доброго дня,
что-то не пойму - танцы с бубном какие-то.

провел эксперимент.
1) создал файл под юниксом с таки же содержанием как и у тебя.
2) скачал его по ssh точно в таком же виде (я так понял ты его именно так качаешь)
3) под виндой четко вижу что конец стороки LF
4) указал явно $/ = \012 - юниксовы формат конца строки LF или \012

код
Код

$/="\012";
open (FF,"c:/rrr.log");
while (<FF>)
    {
    chomp;
    if (/diff/)
        {
        if (/^\\\\\?\\UNC\\root\\(.+?)\t(.+?)\t(.+?)\t(.+?)$/)
            {
            print "$1\n";
            @path = split (/\\/,$1);
            foreach (@path)
                {
                print "--> $_\n";
                }

            print "$2\n";
            print "$3\n";
            print "$4\n";
            }
        }    
    }
close(FF);


работает без проблем.
как я тебе и говорил возможно что там у тебя не только табуляция а например пробел и табуляция, или пробел табуляция пробел или табуляция пробел.

Добавлено @ 12:19
Цитата(EvilsInterrupt @ 17.3.2010,  10:57)
Пообщавшись вчера с dva300 пришли к выводу, что проблема заключена в трактовке символа новой строки, под никсы это 0x0D, т.е. CR , а под винды это 0x0D, 0x0A, т.е. CR LF .


нет, нет так. я такого не говорил.
В системе Unix строки оканчиваются символом - LF (восмеричное \012)
в Macintosh - CR (\015)
в Windows - CRLF (\015\012)

P.S. относительно "опыта" - это была шутка которую походу понял только я

Это сообщение отредактировал(а) dva300 - 17.3.2010, 12:21
--------------------
Участник движения Культура Вождения
PM   Вверх
EvilsInterrupt
Дата 17.3.2010, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: нет
Всего: 9



остались маленькие вопросы по скрипту:


1)
не могу найти continue для Perl . Как аналог в Перл для подобной команды ? чтобы применить его в while и перейти к следующей итерации, не важно в какой глубине if-ов ! ;)

2)
if ($_ =~ /\\str1\\/ || $_ =~ /\\str2\\/ || $_ =~ /\\Str3\\/)
можно ли подобное написать короче ? Смысл при пробегании по массиву полученому после split вычленить и при их наличии записать путь в лог!


Это сообщение отредактировал(а) EvilsInterrupt - 17.3.2010, 16:02
PM MAIL WWW ICQ Jabber   Вверх
dva300
Дата 17.3.2010, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 17.2.2010
Где: Москва

Репутация: 2
Всего: 1



Цитата(EvilsInterrupt @ 17.3.2010,  15:45)
остались маленькие вопросы по скрипту:


1)
не могу найти continue для Perl . Как аналог в Перл для подобной команды ? чтобы применить его в while и перейти к следующей итерации, не важно в какой глубине if-ов ! ;)

2)
if ($_ =~ /\\str1\\/ || $_ =~ /\\str2\\/ || $_ =~ /\\Str3\\/)
можно ли подобное написать короче ? Смысл при пробегании по массиву полученому после split вычленить и при их наличии записать путь в лог!

1) next
2) if (/str1/ || /str2/ ||  /Str3/)

после разбиения split - ом у тебя уже не должно быть \
P.S. так в чем там была проблема ? 
--------------------
Участник движения Культура Вождения
PM   Вверх
EvilsInterrupt
Дата 17.3.2010, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: нет
Всего: 9



Цитата

1) next
2) if (/str1/ || /str2/ ||  /Str3/)


Все как ты и говорил:
$/="\r";

спасибо! )))

еще один вопрос:
если мы внутри while создали цикл foreach , а внутри в одном из условий last , то к чему отнесется этот last ? к foreach или while ?
мне надо выйти из foreach , но продолжить while !

PM MAIL WWW ICQ Jabber   Вверх
dva300
Дата 17.3.2010, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 17.2.2010
Где: Москва

Репутация: 2
Всего: 1



Цитата

Все как ты и говорил:
$/="\r";

спасибо! )))

я вообще то не так говорил smile
или это Mac ?


Цитата

еще один вопрос:
если мы внутри while создали цикл foreach , а внутри в одном из условий last , то к чему отнесется этот last ? к foreach или while ?
мне надо выйти из foreach , но продолжить while !


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


Это сообщение отредактировал(а) dva300 - 17.3.2010, 16:36
--------------------
Участник движения Культура Вождения
PM   Вверх
EvilsInterrupt
Дата 17.3.2010, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: нет
Всего: 9



>>я вообще то не так говорил 
ты намекнул про "$/" smile))

осталось из этого $path[-1] выдрать расширение, к примеру 231234123.bin.23412.ibin . Расширением файла будет ibin. и приплюсовать ее в : if(/str1/ || /str2/)

smile))

близится результат, а это радует ;)
PM MAIL WWW ICQ Jabber   Вверх
dva300
Дата 17.3.2010, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 17.2.2010
Где: Москва

Репутация: 2
Всего: 1



Цитата(EvilsInterrupt @ 17.3.2010,  16:40)
>>я вообще то не так говорил 
ты намекнул про "$/" smile))

осталось из этого $path[-1] выдрать расширение, к примеру 231234123.bin.23412.ibin . Расширением файла будет ibin. и приплюсовать ее в : if(/str1/ || /str2/)

smile))

близится результат, а это радует ;)

что я так и не понял откуда выдрать и куда приплюсовать.
либо давай пример либо звони.

и будет тебе результат smile 
--------------------
Участник движения Культура Вождения
PM   Вверх
EvilsInterrupt
Дата 17.3.2010, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: нет
Всего: 9



>>либо давай пример
есть условие, уже:
Код

if(/str1/ || /str2/)
{
# много кода )))
}


и есть последний элемент массива $path[-1] это имя файла. Надо выдрать расширение файла.
Пример строки "231234123.bin.23412.ibin" . Расширением файла будет ibin.
после того как выдрали, надо поставить результат в условие и сравнить на равность строке "ibin".

Псевдокод, после вставки:
Код

if(FileExt($path[-1] =~ /ibin/) || /str1/ || /str2/)
{
# много кода )))
}


PM MAIL WWW ICQ Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Регулярные выражения | Следующая тема »


 




[ Время генерации скрипта: 0.0579 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.