[gelöst] perl wörter in einer Zeile vertauschen?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Mister L
Beiträge: 26
Registriert: 24.01.2008 10:18:01

[gelöst] perl wörter in einer Zeile vertauschen?

Beitrag von Mister L » 22.01.2009 13:15:15

Hallo,
Ich brauche Starthilfe für Perl.

Es sollen zwei Wortgruppen aus einer Zeile vertauscht werden.
Die Bash an sich erweist sich dazu als ungeeignet.
Die Zeilen sehen alle so aus

Code: Alles auswählen

stock_bottom.svg go-bottom.svg
stock_mail-send.svg mail-send.svg
Den Text habe mit Perl in der Bash biszu der Form bearbeitet, das ging recht schön

Code: Alles auswählen

perl -p -i -e 's/DIES/JENES /g' ~/datei
Nur weiter komme ich nicht

Code: Alles auswählen

perl -p -i -e 's/(stock[-_]*\w+.svg)(\w+[-_*].svg)/$2 $1 /g' ~/datei
Ich habe versucht die beiden Wörte als Variblen einzufangen und wieder hinzuschreiben, aber das geht nicht.
Mein Bash Ansatz war die Zeilen einzeln zu lesen und die Wörter in eine Variable zu isolieren.

Kann ich eine Schleife überhaupt noch mit perl -e formulieren?
Oder muß ich dazu ein Script schreiben.
Und wie kann ich meine Regex erst mal so prüfen (ohne Schleife ohne alles)?

Für mich ist Perl syntax ziemlich verwirrend, aber vielleicht ist es ja gar nicht so schwer;
wenn mir jemand auf die Sprünge hilft.

Grüße Michel
Zuletzt geändert von Mister L am 23.01.2009 04:55:33, insgesamt 1-mal geändert.

Benutzeravatar
Meillo
Moderator
Beiträge: 9267
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: perl wörter in einer Zeile vertauschen?

Beitrag von Meillo » 22.01.2009 13:41:51

Mister L hat geschrieben:Es sollen zwei Wortgruppen aus einer Zeile vertauscht werden.
Was heißt das genau? Mach ein Beispiel.
Die Zeilen sehen alle so aus

Code: Alles auswählen

stock_bottom.svg go-bottom.svg
stock_mail-send.svg mail-send.svg
Meinst du damit 'wort-leerzeichen-wort'? Können die Wörter selbst Leerzeichen enthalten?

Du musst (lernen) die Gegebenheiten und Anforderungen genauer zu formulieren.


Ich habe jetzt einfach mal _geraten_ was du willst.
Dieser Befehlt vertauscht die Reihenfolge von zwei Wörtern in einer Zeilen. Wenn in der Zeilen nur genau zwei Wörter stehen und genau ein Leerzeichen das die Wörter trennt. (Wenn du uns gesagt hast was _genau_ du willst und wie _genau_ die Eingangsdaten aussehen kann man den Befehl noch anpassen.)

Code: Alles auswählen

<input  sed 's/\(.*\) \(.*\)/\2 \1/' >output
Zuletzt geändert von Meillo am 22.01.2009 16:38:54, insgesamt 1-mal geändert.
Use ed once in a while!

yeti

Re: perl wörter in einer Zeile vertauschen?

Beitrag von yeti » 22.01.2009 14:00:24

...mal zur Rehabilitation der Shell:

Code: Alles auswählen

echo -e '1 2\n3 4' | while read a b ; do echo $b $a ; done

roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

Re: perl wörter in einer Zeile vertauschen?

Beitrag von roli » 22.01.2009 14:58:52

Hi,

mir ist nicht klar was du als Ergebnis erwartest. Ist:
Mister L hat geschrieben:

Code: Alles auswählen

stock_bottom.svg go-bottom.svg
stock_mail-send.svg mail-send.svg
Soll 1):

Code: Alles auswählen

go-bottom.svg stock_bottom.svg
mail-send.svg stock_mail-send.svg
Soll 2):

Code: Alles auswählen

stock_mail-send.svg mail-send.svg
stock_bottom.svg go-bottom.svg
Das koenntest du in der Shell mittesl "tac" erreichen
...

Wie auch immer, es gibt eine Funktion namens reverse in Perl.
Roland


"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Re: perl wörter in einer Zeile vertauschen?

Beitrag von nepos » 22.01.2009 15:44:31

Beschreib doch bitte mal verständlich, wie das Ergebnis aussehen soll. Dann kann dir sicherlich jemand gezielt helfen.

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: perl wörter in einer Zeile vertauschen?

Beitrag von Duff » 22.01.2009 15:57:59

Um das Ganze nun auch mal etwas umständlicher in perl auf einfache Art und Weise zu realisieren:
(leider kein Einzeiler, müsste aber auch gehen und kann ich dies in perl nicht so gut)

Code: Alles auswählen

daniel@daniel-laptop:/tmp$ cat test
tock_bottom.svg go-bottom.svg
stock_mail-send.svg mail-send.svg
daniel@daniel-laptop:/tmp$ ./test.pl 
Original: 
tock_bottom.svg go-bottom.svg
Vertauscht: 
go-bottom.svg tock_bottom.svg

Original: 
stock_mail-send.svg mail-send.svg
Vertauscht: 
mail-send.svg send.svg

daniel@daniel-laptop:/tmp$ cat test.pl
#!/usr/bin/perl -w

use strict;

my $datei="test";

open(FH,"<",$datei);
while(<FH>) {
	print "Original: \n";
	print;
	$_ =~ s/([A-Za-z0-9_]+\.\w+)\s+(.*)/$1,$2/g;
	my $erster=$1;
	my $zweiter=$2;
	print "Vertauscht: \n";
	print $zweiter," ", $erster, "\n";

	print "\n";
}
close(FH);
Es eigentlich bei allen Beispielen später auf den richtigen reglären Suchausdruck an.
Oh, yeah!

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Re: perl wörter in einer Zeile vertauschen?

Beitrag von nepos » 22.01.2009 16:44:00

Code: Alles auswählen

$ cat bla.txt
stock_bottom.svg go-bottom.svg
stock_mail-send.svg mail-send.svg

Code: Alles auswählen

$ perl -lne 'print join(" ", reverse split)' < bla.txt
go-bottom.svg stock_bottom.svg
mail-send.svg stock_mail-send.svg

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: perl wörter in einer Zeile vertauschen?

Beitrag von Duff » 22.01.2009 16:51:47

@nepos: So ist es natürlich eleganter!!! (und schneller)
Oh, yeah!

Mister L
Beiträge: 26
Registriert: 24.01.2008 10:18:01

Re: perl wörter in einer Zeile vertauschen?

Beitrag von Mister L » 22.01.2009 18:20:08

Vielen Dank an alle.
Und sorry, ich versuch in Zukunft die Sache präziser anzugehen; sowohl bei der Fragestellung!
als auch bei der Lösung des Problems selbst.
Aus

Code: Alles auswählen

stock_bottom.svg go-bottom.svg
stock_mail-send.svg mail-send.svg
sollte

Code: Alles auswählen

go-bottom.svg stock_bottom.svg
mail-send.svg stock_mail-send.svg
werden.

Fuktionieren tun alle drei Lösungen

Code: Alles auswählen

cat datei| while read a b ; do echo $b $a ; done
cat datei| sed 's/\(.*\) \(.*\)/\2 \1/' >datei.neu
sind halt recht leicht zu handhaben;und ein Beispiel,daß in der Bash ist weit mehr möglich als man gemeinhin denkt.

Das Perl-script funktioniert auch nachdem in die erste regex noch ein '-' eingefügt habe

Code: Alles auswählen

([A-Za-z0-9_-]+\.\w+)
Das Script ist für diese Aufgabenstellung vielleicht mit "Kanonen auf Spatzen geschossen"
aber für mich trotzdem Gelegenheit mich mal damit zu beschäftigen (und ein Erfolgserlebnis).

Danke
Michel

Mister L
Beiträge: 26
Registriert: 24.01.2008 10:18:01

Re: perl wörter in einer Zeile vertauschen?

Beitrag von Mister L » 22.01.2009 18:38:22

Dank auch an nepros für deinem Einzleier.
Allerdings brauch ich da 'ne Weile bis ich den Bfehl im Einzelnen verstehe.

Michel

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Re: [gelöst] perl wörter in einer Zeile vertauschen?

Beitrag von nepos » 23.01.2009 09:02:11

Naja, so schwer zu verstehen ist es eigentlich nicht :)
-l schaltet den Zeilenmodus von Perl ein
-n macht quasi automatisch eine while(<>) { } Schleife, die die Daten zeilenweise einliest
-e gibt den auszuführenden Code mit
split ohne Parameter splittet $_ (da ist immer die aktuelle Zeile drin) an Spaces und liefert einen Array zurück
reverse nimmt den Array von split und dreht die Reihenfolge der Elemente um
join(" ", ...) nimmt dann wieder den Array, den reverse ausspuckt und hängt die Elemente mit einem Space wieder aneinander
print gibt das ganze dann aus.
Geht also ganz ohne komplizierte Regex, solange in den Dateinamen keine Leerzeichen enthalten sind.

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: [gelöst] perl wörter in einer Zeile vertauschen?

Beitrag von Duff » 23.01.2009 09:06:28

Gute Erklärung, aber beim nächsten Mal müsste ich wieder lange überlegen um auf die einzelnen Parameter bei einem perl-Einzeiler zu kommen. Aber für solche Sachen ist er auf jeden Fall die beste, einfachste und schnellste Lösung :)

(ich muss mir diese 3 parameter wohl mal merken...)
Oh, yeah!

Mister L
Beiträge: 26
Registriert: 24.01.2008 10:18:01

Re: [gelöst] perl wörter in einer Zeile vertauschen?

Beitrag von Mister L » 24.01.2009 16:32:41

Noch als Nachtrag:
Danke für die Erläuterung.
Ihr werdet lachen, aber solche Sachen (kommandos) hebe ich mir erst mal auf.
Als Beispiel oder Muster - so oft braucht man ja das nicht.

Perl ist für mich noch etwas "kryptisch".
Das sind sehr viele Zeichen doppelt oder öfter in Verwendung.
Und es gibr oft mehrere Möglichkeiten um eine Sache auszudrücken (zB Deine Schleife).

Ist halt alles gewöhnungsbedürftig.

Michel

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Re: [gelöst] perl wörter in einer Zeile vertauschen?

Beitrag von nepos » 26.01.2009 08:42:18

Mister L hat geschrieben:Perl ist für mich noch etwas "kryptisch".
Das sind sehr viele Zeichen doppelt oder öfter in Verwendung.
Und es gibr oft mehrere Möglichkeiten um eine Sache auszudrücken (zB Deine Schleife).

Ist halt alles gewöhnungsbedürftig.

Michel
Stimmt schon. Wobei man Perl so oder so coden kann. Das eine ist dann recht unleserlich, das andere kann man genauso gut verstehen, wie jede andere Hochsprache.
Und dass es meistens mehr als einen Weg gibt, nun ja, das is ja auch das Perl-Motto ;)

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: [gelöst] perl wörter in einer Zeile vertauschen?

Beitrag von Duff » 26.01.2009 08:49:13

Zum Thema perl gibt es übrigens auch ein gutes Forum [1].
Dort sind u.a. auch Wikis und Tutorials zu finden.

[1] http://www.perl-community.de/
Oh, yeah!

Antworten