2010-12-09 3 views
2

Ich bin völlig neu in diesem Unix-Bash-Zeug - und die erste Frage hier! Hoffe ihr helfen können :)Unix-Shell-Bash 'Einzeiler', um alle Klammern zu isolieren, die eine URL enthalten, die ".mp3" enthält

Problem:

Ich habe eine Masse von unordentlich Web-Quellcode (Verpackung/unformatiert), die mehrere Vorkommen:

('http: // www. example.com/path/audio.mp3')

Könnten Sie mit einem Einzeiler bitte helfen (sed/awk ...), die diese Vorkommen von Klammern isolieren eine URL enthält, die „.mp3" enthält , sauberes Vor-/Nachlauf "() "und" "" Zeichen und dann als Liste (eine pro Zeile) in eine aktive TXT-Datei.

Hinweis: Der Einzeiler wird in Automator auf dem Mac als Dienst/Arbeitsablauf verwendet, um den ausgewählten Text zu bearbeiten.

Jede Hilfe würde sehr geschätzt werden, als (trotz der Trawl durch alle Online-Tuts) bin ich völlig verloren.

Mit besten Grüßen,

Dave

+0

Haben Sie jemals mehr als eine mp3 pro Quellzeile aufgelistet? –

+0

Ja, in einigen Fällen (denke ich). Obwohl ich weiß, dass alles unformatiert ist, weiß ich ehrlich gesagt nicht, dass die Zeile definiert ist ... –

Antwort

4

Verwenden egrep mit -o (nur die Teile, die übereinstimmen) sollten den Trick tun. Probieren Sie etwas wie folgt aus:

egrep -o "http://[^'\"]+.mp3" FILENAME 
+0

+1: Prägnant, und beantwortet die Frage direkt. Fängt auch mehrere Instanzen in einer einzelnen Zeile korrekt ab. – EOL

+0

Es wäre schön, wenn die Klammern und die Anführungszeichen ebenfalls übereinstimmen, aber nicht ausgegeben werden ... Ist das möglich, mit egrep? – EOL

+0

Danke, Simon. Das hat wunderbar funktioniert! –

0

awk '{print $2}' FS="('|')" < filename

cat filename | tr ')' '\n' | awk '{print $2}' FS="('|')" > output.txt

Ersetzen Sie einfach filename mit dem Namen der Datei diese Zeilen enthalten ..

OR

echo "your multiline\ 
text here" | tr ')' '\n' | awk '{print $2}' FS="('|')" 

einfach mal ausprobieren:

tr ')' '\n' | awk '{print $2}' FS="('|')"

+0

Das fängt nicht mehrere Vorkommen in einer Zeile auf. –

+0

Wahr. Korrigiert, um das einzuschließen. –

+0

Wie würde ich das verwenden? ohne "filename" und "output.txt"? Prost –

0

PERL, die Mac haben sollten.

perl -ne $'while(/\(\'(http:\/\/[\w.\/]+?\.mp3)\'\)/g) { print "$1\n"; }' <input_file> output_file 

Es lesen stdin (hier: input_file)

#!/usr/bin/perl 
while(<STDIN>) 
{ 
    $_ =~ /.*(http:\/\/.*\.mp3).*/; 
    print $1 . '\n'; 
} 
+0

Danke für deine Antwort, Tim. –

+0

Ich lief das Skript in Automator, aber bekam "http://www.italian-flashcards.com/mp3-words-patrick/2239.mp3\n" ... anstelle einer Liste aller URL-Links ... –

+0

Hmm . Hast du nur eine Zeile erhalten, oder ist das Problem der Zeilenende am Ende? Wie viele Einträge befanden sich in Ihrem Eingabe-Set? –

0

Versuchen Sie, die folgenden verfeinern eine Zeile zu einem Zeitpunkt, jedes Auftreten eines „url“ sucht in dieser Zeile und druckt sie auf stdout (hier: output_file) ohne (' und ').

+0

Ich habe das in Automator mit "usr/bin/perl" versucht, aber die " output_file" ausgeschlossen und konnte es nicht zum gehen bringen ... irgendwelche Ideen? –

+0

Es gab einen Fehler - ich vermisste das '/' ... Entschuldigung dafür. Hier ist ein Beweiskonzept: 'echo -e" cat \ ndog ('http: //someserver/somefile.mp3') maus \ nbee "| perl -ne $ 'while (/ \ (\' (http: \/\/[\ w. \ /] +? \. mp3) \ '\)/g) {print "$ 1 \ n"; } ' – TomaszK

+0

Wo in dem Skript wird das verpasste "/" gehen? –

0

Dadurch werden die URLs übereinstimmen, die in Klammern und einfache Anführungszeichen erscheinen:

grep -Po "(?<=\(')http.*?mp3(?='\))" 

Die URLs ausgegeben werden, eine pro Zeile, ohne Klammern oder einfache Anführungszeichen.Die Option -P für Perl-kompatible reguläre Ausdrücke ist (mindestens) in den Versionen GNU und OS X grep verfügbar.

+0

Danke, Dennis. Das Skript funktionierte, druckte jedoch nur 8 der 40 URLs aus, die im Web-Quellcode enthalten waren. Könnte es sein, dass Ihr Skript nicht mehrere URL-Instanzen in einer Zeile erfasst? –

+0

@dave: Nein, wenn ich es mit mehreren URLs auf einer Zeile und mehreren Zeilen wie in Ihrer Frage gezeigt teste, gibt es alle aus. Kannst du mir ein Beispiel von einem zeigen, das es nicht bekommt? –

Verwandte Themen