Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1
Hej,
Jakis czas temu mialem zadanko w postaci znajdz tylko jakis regex w pliku. No ok to grep -o. Ale okazalo sie ze to wywala kazde znalezisko do nowej lini. Regex to byly liczby ktore nalezalo posumowac per linia. Ale w lini byly tez inne syfy np daty.
Wiec zadanie brzmi: znajdz w kazdej lini liczbe tak aby mozna je potem wysumowac w liniach.
W liniach tez byly daty wiec tez liczby. Moj regex to [tt]\ [0-9]{,3}\.[0-9]{,2};[/tt]
Rozwiazalem to na opak czyli wywal 'syf'. W ten sposob zostaly mi liczby w liniach. Zastanawiam sie jednak czy jest cos takie co by mi rowiazalo problem i bylo ladne. Jakis sed -o. Wiem ze jest sed -n '//p' ale to mi nie chcialo cos dzialac.
Nie pogardze awk ale wole sedy i inne. Moze grep ma jakias opcje co nie bedzie wywalac do nowej linii?
Z gory dzieki
Pozdro
Offline
pierwszy wynik w googlu pod hasłem "grep dotall".
ogólnie musisz przełączyć grepa w tryb perl-regexp i tam bawić się opcjami w samym wyrażeniu.
Offline
Tak myslalem ze perl bedzie lekarstwem. Dzieki za info. Zastanawia mnie co by mialo znaczyc to dotall ale jutro moze jak poszperam to zrozumiem.
Offline
nie "perl będzie lekarstwem" tylko przełączenie grepa w tryb kompatybilności z wyrażeniami regularnymi perla (co z samym perlem nie ma absolutnie nic wspólnego).
Co do "dotall"... warto poznać postawy działania wyrażeń regularnych oraz terminologię, zanim się spróbuje napisać swojego pierwszego regexpa.
Inaczej: "dotall" znaczy "dot all" - już rozumiesz?
Offline
Wiesz jak tak patrze w necie na to co napisales to chyba kompletnie mnie nie zrozumiales. Przyklad
2014-01-02 123.12; 2013-03-23 12.23; 2014-02-31 143.23; 2012-02-01 123.23; 2012-02-01 13.12;
Chce
123.12; 12.23; 143.23; 123.23; 13.12;
I sory ale przelaczenie w tryb zgodny z perlem oznacza ze bez perla sie nie obejdzie. Jego jako narzedzia nie ale on sam sie do tego przyczynil. Musial zaistniec na swiecie.
Offline
w sumie wydaje mi się, że grepem tego nie zrobisz (nie do tego służy). sed, awk - owszem. w perlu czy pythonie to w ogóle nie ma o czym mówić... ale użycie właściwych narzędzi do osiągnięcia konkretnego celu powinno być priorytetem. owszem, można wbijać gwoździe kombinerkami ale po co się męczyć, jeśli obok leży młotek?
btw. nie "zgodny z perlem" a "zgodny z dialektem wyrażeń regularnych używanych w perlu" - jak by nie patrzeć, duża różnica. przy czym -o dziwo - perl używa nieco innej składni ;)
a w ogóle to na początku był snobol :D
Offline
Dokumentacja grepa w przejrzysty i oczywisty sposób informuje o zachowaniu w przypadku korzystania z opcji "--only-matching".
"Print only the matched (non-empty) parts of a matching line, with each such part on a separate output line."
Identycznie zachowuje się pcregrep.
"...If there is more than one match in a line, each of them is shown separately..."
Grep nie ma być zamiennikiem sed-a lub awk-a.
Offline
Come on! Kurcze Panowie, co jest?!? Gdzie ja napisałem że to musi być grep? :D
[quote=/me]Nie pogardze awk ale wole sedy i inne. Moze grep ma jakias opcje co nie bedzie wywalac do nowej linii?[/quote]
Napisałem o grepie bo ma tą opcje -o co najłatwiej mi było wytłumaczyć o co chodzi... Tak mi się wydawało.
Może jest ktoś na sali kto miałby jakieś rozwiązanie? Tak z ciekawości poznałbym coś nowego.
Pozdr
Offline
W jakim języku to chcesz zakodzić?
Pytam, bo w miarę spójne API ma biblioteka pcre, która dostarcza też takie programy:
qlist libpcre | grep bin /usr/bin/pcre-config /usr/bin/pcretest /usr/bin/pcregrep
Może to się przyda?
Offline
Ogolnie im prostrze tym lepiej czyli na poczatek te bashowe znane. Sed awk grep tr cut i inne... jak se ne da to jakies mniej znane czyli to co podales np. Nie intetesuja mnie kobyly typu phyton czy perl bo rownie dobrze moge na pisac program w C do tego... nawet z gui. ;-)
@Jacekalex dzieki. Bede patrzec na to narzedzie.
Offline
Przecież w tym swoim przykładzie już zaprzęgłeś regexp do roboty z grepem.
W przypadku seda nie różni się to:
sed 's/[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\} //g' < input
lub
sed -r 's/[0-9]{4}-[0-9]{2}-[0-9]{2} //g' < input
Offline
[quote=admetus]Przecież w tym swoim przykładzie już zaprzęgłeś regexp do roboty z grepem.
W przypadku seda nie różni się to:
sed 's/[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\} //g' < input
lub
sed -r 's/[0-9]{4}-[0-9]{2}-[0-9]{2} //g' < input[/quote]
Ja j*bie... Ręce mi opadają...
[quote=/me]Rozwiazalem to na opak czyli wywal 'syf'. W ten sposob zostaly mi liczby w liniach.[/quote]
Czyli dokładnie to co ty zrobiłeś. To po co ja do licha piszę na forum? Czekaj czekaj...
[quote=/me]Zastanawiam sie jednak czy jest cos takie co by mi rowiazalo problem i bylo ladne. Jakis sed -o. Wiem ze jest sed -n '//p' ale to mi nie chcialo cos dzialac.[/quote]
Aaa! Popatrz... Ładne oznacza w tym przypadku logiczne. Wiem co chce wyłapać i tego mam regex, a nie cały pozostały syf, który nie mam pojęcia jak może wyglądać. Gdy masz duży txt nie możesz mieć pewności, że 'syf' będzie _zawsze_ takiej postaci jak podałeś. KPW? ;)
Offline
to napisz to wreszcie w c - szybsze będzie a i regexpów nie trzeba...
Offline
Strony: 1
Time (s) | Query |
---|---|
0.00011 | SET CHARSET latin2 |
0.00004 | SET NAMES latin2 |
0.00100 | SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='3.17.155.142' WHERE u.id=1 |
0.00197 | REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '3.17.155.142', 1732216118) |
0.00048 | SELECT * FROM punbb_online WHERE logged<1732215818 |
0.00057 | SELECT topic_id FROM punbb_posts WHERE id=274743 |
0.00363 | SELECT id FROM punbb_posts WHERE topic_id=26342 ORDER BY posted |
0.00072 | SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=26342 AND t.moved_to IS NULL |
0.00006 | SELECT search_for, replace_with FROM punbb_censoring |
0.00087 | SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=26342 ORDER BY p.id LIMIT 0,25 |
0.00166 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=26342 |
Total query time: 0.01111 s |