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/.
Witam. Chciałbym napisać prosty skrypt w bashu, który z danego pliku tekstowego bedzie pobierał ciąg znaków znajdujący się między znakami " i ", a następnie uruchamiał inny program z tym ciągiem podanym jako argument. Mam problem z wyszukaniem tego wyrażenia. Próbowałem
x=`grep charakterystyczne_wyrazenie nazwa_pliku`
ale w takiej sytuacji otrzymuję cały wiersz, z którego teraz potrzebuję
"wykroić" interesujący mnie ciąg znaków. Czy można zrobić to w jakiś prosty sposób, najlepiej bez bawienia się w pętle i przepisywanie pojedynczych znaków? Otrzymany wiersz jest postaci:
aaaaa"szukane_wyrażenie"bbbbb, gdzie aaaaa i bbbbb są zawsze stałe, bez względu na plik, więc można byłoby po prostu odciąć określoną ilość znaków z lewej i z prawej. Będę wdzięczny za sugestie jak można to zrealizować.
Offline
Komendy masz miedzy:
aaa bbb
program odpalasz ./skrypt.sh plikzkomendami
#!/bin/bash `cat $1 | egrep 'aaa.*bbb' | awk '{ command=gensub("aaa(.+)bbb", "\1", 1, $0); print command }'`
Offline
Przykładowy plik wygląda tak:
<ASX Version="3.0"> <TITLE>06566980108070690</TITLE> <Entry> <Ref href="mms://mms.content.loudeye.com/600111/p/065/66/98/0656698_0108_07_0690.wma" /> </Entry> </ASX>
Chciałbym, żeby działanie skryptu polegało na uruchomieniu:
mplayer mms://...
Próbowałem zrobić tak jak pisze KARQL, ale wyświetla się:
awk: 1: unexpected character '.'
Offline
#!/bin/bash cat $1 | egrep '<Ref href=".+" />' | awk '{ command=gensub("<Ref href="(.+)" />", "\1", 1, $0); print command }'
Offline
Wyświetla mi:
awk: line 2: function gensub never defined
Offline
u mnie dziala.
A moze to byc w perlu zamiast bashu?
Offline
Może być w perlu. Zastanawiałem się czy może powinienem dociągnąć jeszcze jakieś pakiety, ale nic sensownego nie znalazłem.
Offline
#!/usr/bin/perl use warnings; use strict; while (<>) { `$1` if /<Ref href="(.+?)" />/; }
Uruchamianie: perl skrypt.pl plikzkomendami
Offline
Uruchamianie: perl skrypt.pl plikzkomendami
[/quote]
Dzięki, w zasadzie to działa, tylko ten skrypt próbuje uruchomić to wyrażenie, które odczytał... A ja bym chciał, żeby to wyrażenie było argumentem dla mplayera, czyli żeby wynikiem działania skryptu byłoby wywołanie:Kod:
mplayer mms://mms.content.loudeye.com/600111/p/065/66/98/0656698_0108_07_0690.wmaCzy można odczytany ciąg zapisać do jakiejś zmiennej i z poziomu perla zrobić wywołanie: mplayer zmienna?
Offline
Tak wszystko sie da tylko trzeba ruszyc glowa.
Na poczatku chciales tylko sugestie.
Ja Ci nie bede wszystkiego na tacy wykladal i tak Ci dalem az za wiele.
Edit:
`mplayer $1` if /<Ref href="(.+?)" />/;
Offline
Denerwuje mnie takie podejście. Albo faktycznie chcesz pomóc, albo odpuszczasz zamiast zgrywać ważniaka. Dzięki Bogu, że programiści Linuksa nie stosują takiego podejścia... są błędy? No to co z tego, niech sobie użytkownicy sami poprawią i przekompilują, w końcu nie będziemy im dawać wszystkiego na tacy.
To co podałeś nie działa. I z punktu widzenia osoby, która nie zna Perla jest kompletnie bezużyteczne. Zresztą już napisałem sobie programik w c++, więc EOT.
Gdyby kogoś interesowało (czyta wszystkie sample muzyczne .asf z amazon.com):
# include <iostream> # include <fstream> # include <string> using namespace std; main(int argc, char *argv[]) { ifstream plik_we; plik_we.open(argv[1]); string temp; for(int i=0; i<5; i++) plik_we>>temp; string szukane_wyrazenie; plik_we>>szukane_wyrazenie; plik_we.close(); // // kasuje pierwsze 6 znakow, zawsze takie same szukane_wyrazenie.replace(0,6,""); // // kasuje ostatni znak - zawsze " szukane_wyrazenie.replace(szukane_wyrazenie.length()-1,1,""); // // szukane_wyrazenie="mplayer " + szukane_wyrazenie; system(szukane_wyrazenie.c_str()); }
Offline
Time (s) | Query |
---|---|
0.00014 | SET CHARSET latin2 |
0.00008 | SET NAMES latin2 |
0.00083 | 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='18.226.177.216' WHERE u.id=1 |
0.00223 | UPDATE punbb_online SET logged=1716106937 WHERE ident='18.226.177.216' |
0.00036 | SELECT * FROM punbb_online WHERE logged<1716106637 |
0.00122 | DELETE FROM punbb_online WHERE ident='40.77.167.49' |
0.00096 | 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=3402 AND t.moved_to IS NULL |
0.00008 | SELECT search_for, replace_with FROM punbb_censoring |
0.00355 | 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=3402 ORDER BY p.id LIMIT 0,25 |
0.00151 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=3402 |
Total query time: 0.01096 s |