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
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:
mplayer mms://mms.content.loudeye.com/600111/p/065/66/98/0656698_0108_07_0690.wma
Czy 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