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/.

Użytkownik


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




matka przelozona
Członek DUG

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

Użytkownik


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
Członek DUG

#!/bin/bash
cat $1 | egrep '<Ref href=".+" />' | awk '{ command=gensub("<Ref href="(.+)" />", "\1", 1, $0); print command }'

Offline

Użytkownik


Wyświetla mi:
awk: line 2: function gensub never defined
Offline
Członek DUG

u mnie dziala.
A moze to byc w perlu zamiast bashu?

Offline

Użytkownik


Może być w perlu. Zastanawiałem się czy może powinienem dociągnąć jeszcze jakieś pakiety, ale nic sensownego nie znalazłem.
Offline
Członek DUG

#!/usr/bin/perl
use warnings;
use strict;
while (<>) {
`$1` if /<Ref href="(.+?)" />/;
}
Uruchamianie: perl skrypt.pl plikzkomendami

Offline

Użytkownik


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
Członek DUG

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

Użytkownik


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