Script gesucht

Madcat

Madcat

Aktives Mitglied
Thread Starter
Dabei seit
01.02.2004
Beiträge
20.553
Reaktionspunkte
8.489
Eins vorweg: Ich hab mir Applescript bisher noch nicht soo genau angeschaut.

Was ich suche ist ein Script, dass mir ein Textfile umwandelt welches ich selbst vorgebe (kann auch ein Text aus der Zwischenablage sein). Die Umwandlung soll folgendes beinhalten:

Vor jedem "Return" (also bei jedem Zeilenumbruch) soll "\\" eingefügt werden.

Hintergrund: Ich hab da ein paar größere Textfiles die ich in ein LaTeX-Dokument einfügen will und die Zeilenumbrüche sollen dabei erhalten bleiben. Manuell dauert das gewiss eine halbe Ewigkeit.

Wäre super, wenn mir da einer helfen könnte.
 
Ich würde das mit Perl realisieren.
Etwa so:
Code:
#!/usr/bin/perl 
#
###
### slash.pl
### Haengt "//" an jedes Zeileende an
### 07.01.2005
### maceis
###

use warnings;
use strict;

my $number = $#ARGV+1;
if ($number eq 1)
{
    &infiletest($ARGV[0]);
    &outfiletest($ARGV[0]);
    open (INFILE, $ARGV[0]) || die "Konnte \"$ARGV[0]\" nicht öffnen";
    open (OUTFILE,">>$ARGV[0].out") || die "Konnte \"$ARGV[0]\.out\" nicht anlegen";
    my $zeile; 
    while ( $zeile = <INFILE>)
    {
        chomp $zeile; 
        $zeile =~ s/$zeile/$zeile\\\\\n/;
        print OUTFILE $zeile; 
    }
}
else 
{
    print "Usage: slash.pl file\n";
    exit;   
}

# Pruefen, ob Eingabedatei vorhanden ist
sub infiletest
{
    unless ( -T $_[0] ) 
    {
        print "Datei \"$_[0]\" existiert nicht oder ist keine Textdatei\n";
        exit;   
    }
}
# Pruefen, ob Ausgabedatei vorhanden ist
sub outfiletest
{
    my $action;
    if ( -T "$_[0].out" )
    {
        print "Datei \"$_[0].out\" existiert schon\nSoll sie gelöscht werden?[j|n]";
        $action = <STDIN>;
        chop $action;
        if ( $action eq "j") 
        {       
            unlink "$_[0].out";
            return  
        }       
        else    
        {       
            die "Programm wurde beendet\n";
        }       
             
    }
}

Ich habs mal schnell runtergehackt.
Kann man sicher noch optimieren, aber es funktioniert und immerhin ist schon eine gewisse Fehlerkontrolle eingebaut.

Das Skript speicherst Du als Textdatei (slash.pl) und machst diese dann ausführbar.
Aufgerufen wird das Skript dann so:
./slash.perl Dateiname
Die Ausgabe mit Slashes erfolgt dann in der Datei "Dateiname.out"

HTH
 
Also als Textdatei hab ich das Script jetzt aber wie mach ich es "ausführbar"? Bin da wohl ein wenig unbeholfen ;)
 
Madcat schrieb:
Also als Textdatei hab ich das Script jetzt aber wie mach ich es "ausführbar"? Bin da wohl ein wenig unbeholfen ;)
Macht nichts, jeder fängt mal an.

Das Skript funktioniert im Terminal ?
Du gehst also ins Terminal und wechselst in das Verzeichnis, in dem das Skript liegt.
angenommen es liegt auf Deinem Schreibtisch:
cd ~/Desktop
Dann machst Du es ausführbar mit:
chmod +x slash.pl
Voraussetzung: Das Skript heisst auch slash.pl und nicht etwa slash.pl.txt
Wichtig ist außerdem, dass es eine reine Textdatei ist.
Beim Aufruf musst Du den Dateinamen mit Pfad angeben oder die Datei auf den Desktop kopieren.
Die Ausgabedatei wird in dem Verzeichnis angelegt, in dem die Eingabedatei liegt.
 
Ich glaub ich bin zu doof. Im Terminal tut sich bei mir nix wenn ich den Befehl eingebe. Und ja, das Script ist als Textdatei abgelegt.
 
Es soll sich auch nichts tun, außer, dass eine Datei erstellt wird, die so heisst, wie die Eingabedatei und als letztes Suffix ".out" erhält.
Das ist die Datei, mit den Slashes ;).
 
Hm, hab ich ja aber es hat sich nix getan?? Leider.

Ich hab mich auch grade mal durch Applescript gelesen. Ich bin jetzt eigentlich soweit, dass ich einen Text in ein Eingabefeld einlesen kann, die Absätze lesen kann und auch das ganze ausgeben kann. Nur wie sag ich dem ganzen jetzt, dass ich nach jedem Absatz ein \\ haben will?

Code:
set temp to display dialog "Zeilenumbruch für LaTeX" default answer "" buttons {"OK"} default button 1
set eingabe to text returned of temp
set end of every paragraph of eingabe to "\\\\"
display dialog "LaTeX" default answer eingabe

Irgendwie macht er dabei gar nix. Ich nehm mal an, das "end" mach er nicht. Mit "last character" bekomme ich immer eine Fehlermeldung :(
 
Mit dem 'read'-Befehl kannst du Textdateien lesen und in eine Variable verfrachten. Daraufhin wendest du eine Suchen/Ersetzen-Funktion an.
Wie das mit AppleScript realisierbar ist, findest du z.B. hier:

http://www.fischer-bayern.de/phpBB2/viewtopic.php?t=690

Danach brauchst du den geänderten Text nur noch von der Variable in ein Textdocument schreiben - das funktioniert mit 'write'.
 
Danke, Snow. Diese Seite hab ich genutz um mir so ein wenig was beizubringen. Die aktuelle Frage ist ja, wie ich an das Ende einer Zeile Zeichen anhängen kann ;)
 
Ich habe die Frage schon verstanden.

Meine Lösung siehe oben - Text in Variable verfrachten -
Zeilenschaltungen ersetzen durch "\\" & Zeilenschaltung -
Den bearbeiteten Text wieder in die Textdatei schreiben.

Das Suchen/Ersetzen muss ja schließlich nicht auf einzelne Buchstaben oder Zahlen begrenzt sein.
 
Nach etwas Überlegung bin ich zu der Übereinkunft gekommen, dass ich den Text erstmal aus der Zwischenablage kopiere. Ich werd später noch einen Code hinzufügen, mit dem man den Text auch aus einer Datei lesen kann nur dazu bin ich zu faul. Danke Snow, für deine Hilfe. Mein Problem lag in der Art des Testens. However hier ist meine derzeitige Lösung, die für mich erstmal ausreichend ist. Der Code kommt aus dem Forum von Fischer-Bayern. ;)

Code:
set dialoge to display dialog "Zeilenumbruch für LaTeX" default answer ""
set myText to text returned of dialoge
set mySearch to (ASCII character 13)
set myReplace to "\\\\" & (ASCII character 13)

set ausgabe to textReplace(myText, mySearch, myReplace)
display dialog "Ausgabe" default answer ausgabe

on textReplace(theText, srchStrng, replStrng)
	tell (a reference to AppleScript's text item delimiters)
		set {od, contents} to {contents, {srchStrng}}
		try
			set {textList, contents} to {(text items of theText), {replStrng}}
			set {newText, contents} to {(textList as text), od}
			return item 1 of result
		on error errMsg number errNbr
			set contents to od
			error errMsg number errNbr
		end try
	end tell
end textReplace
 
Zurück
Oben Unten