Shell: Aus einer Zeichenkette einen bestimmten Ausschnitt kopieren

overflow

Member of Honour
Ich möchte aus einer Zeichenkettenfolge einen bestimmten Bereich raus kopieren (Shell):

Beispiel:
HTML:
<a href="mailto:"bbbb"><img src="image.png"></a>

Jetzt würde ich gerne diesen Teil "bbbb" raus kopieren bzw. in einer andere Datei umleiten.

Ich experimentiere gerade mit sed herum.
Falls ich selbst auf die Lösung kommen sollte,
werde ich es hier veröffentlichen.

In PHP war es wesentlich einfacher gewesen.
 
Auch wenn PHP als Commandlinetool nicht weit verbreitet ist, kann man es auch als solches einsetzen.
 
Nichtsdestotrotz trotz brauche ich die Lösung in der Unix-Shell.
Die Lösung in PHP ist mir bekannt, aber aus skripttechnischen Gründen benötige ich es in der Shell.
 
Erstmal bedanke ich mich für deine Hilfe.
Die gleiche Lösung konnte ich auch durch google zusammen basteln.
Wenn ich das Skript an meinem Beispiel anwende funktioniert es einwandfrei.

Das Problem liegt anscheinend am Format:
Schaut es euch selbst an.

Mich würde interessieren woran es liegt.

An den Leerzeichen und Tabulatoren kann es definitiv nicht liegen.
Mit
Code:
sed 's/^[[:space:]]*//' test.txt
konnte ich es entfernen.
Trotzdem kein Erfolg.
 
Zuletzt bearbeitet:
Mit sed kannst du auch Standard-Regexen anwenden. Allerdings könnte sich Perl, das auf ziemlich jedem Unix-System zur Verfügung steht, da besser eignen.

Code:
#!/usr/bin/perl

open(FILE, "test.txt"); # hier die datei angeben, die den html-code enthaelt
foreach my $line (<FILE>) {
    if($line =~ /<a href=\"mailto:\"(.*)\"><img .*/) {
       print $1;
    }
}

Die gleiche Regexe sollte sich aber auch mit sed in ähnlicher Weise verwenden lassen. Ich setze halt eher auf Perl und kenne daher die Syntax von sed nicht auswendig. Alternativ kannst du den Code auch einfach mittels "perl -e '...'" ausführen.
 
Als ich gesehen habe das bitmuncher geschrieben hat,
wusste ich genau: Ein Perl-Skript.

Die Perl-Variante kann ich leider nicht benutzten,
weil ich nur ein Shellskript haben möchte.
Ehrlich gesagt hat es auch nicht funktioniert.
Ich habe keine Ausgabe erhalten (auch nicht mit print $line;).

@GrafZahl: Funktioniert es bei dir ?
Bei mir nicht...
 
Code:
bitmuncher@alpha:~> cat test.pl
#!/usr/bin/perl

open(FILE, "test.txt");
foreach my $line (<FILE>) {
    if($line =~ /<a href=\"mailto:\"(.*)\"><img .*/) {
       print $1;
    }
}
bitmuncher@alpha:~> cat test.txt
<a href="mailto:"bbbb"><img src="image.png"></a>
bitmuncher@alpha:~> perl test.pl 
bbbbbitmuncher@alpha:~>

Die Umleitung sollte da ja wohl das geringste Problem sein: perl test.pl > out.txt

Edit: Oder als One-Liner:

Code:
bitmuncher@alpha:~> perl -e 'open(FILE, "test.txt"); foreach my $line (<FILE>) { if($line =~ /<a href=\"mailto:\"(.*)\"><img .*/) { print $1; } }' > test2.txt 
bitmuncher@alpha:~> cat test2.txt 
bbbbbitmuncher@alpha:~>

Quasi ein Shell-Skript. ;)
 
Jetzt sehe ich woran es liegt:
Funktioniert dein Skript auch auf die Datei im Anhang ?

Klingt jetzt merkwürdig aber:
sed, sowie deine Perl-Varianten funktionieren.
Nur bei der Datei im Anhang hab ich Probleme :rolleyes:
 
Zuletzt bearbeitet:
Hier noch als Ergänzung eine angepasste Version des One-Liners von oben:

Code:
bitmuncher@alpha:~> cat test.txt 
<td class="mail"><a href="mailto:wwwwwww"><img src="test.png" alt="" title="test" /></a></td>
bitmuncher@alpha:~> perl -e 'open(FILE, "test.txt"); foreach my $line (<FILE>) { if($line =~ /<a href=\"mailto:(.*)\"><img .*/) { print $1; } }' > test2.txt 
bitmuncher@alpha:~> cat test2.txt 
wwwwwwwbitmuncher@alpha:~>
 
Zurück
Oben