Textdatei zeilenweise editieren

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von FrankSchmitz, 10.03.2008.

  1. #1 FrankSchmitz, 10.03.2008
    FrankSchmitz

    FrankSchmitz Jungspund

    Dabei seit:
    23.04.2007
    Beiträge:
    23
    Zustimmungen:
    0
    Guten Morgen allerseits,

    ich komm leider bei einem kleinen Skript (Bourne) nicht weiter - vielleicht könnt ihr mir ja helfen...

    Es ist so, dass ich eine Eingabe-Textdatei habe, die zeileweise eingelesen werden soll. Bei Bedarf kann die Zeile dann geändert werden.
    Unten mal ein Auszug von der kritischen Stelle.

    Aber irgendwie komm ich da nicht weiter. (Die Abfrage des zweiten READ geht nicht)
    Kann es sein, dass der geschachtelte Read so nicht gehen kann?


    Code:
    while read LINE
    do
    	clear
    	echo "$LINE"
    	echo "-----"
    	echo "   (1) Text aendern"
    	echo "   (2) Text nicht aendern"
    	read EINRECORD
    
    	if [ $EINRECORD = "1" ] ; then echo "Die Abfrage geht nicht" ; fi
    
    	echo "$LINE" >> Ausgabedatei.dat
    done < Textdatei.dat
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 Hans Dampf, 10.03.2008
    Hans Dampf

    Hans Dampf Jungspund

    Dabei seit:
    19.01.2008
    Beiträge:
    20
    Zustimmungen:
    0
    Das geschachtelte READ habe ich auch nicht zum Laufen bekommen und deshalb mit sed gearbeitet:
    Code:
    #!/bin/sh
    
    FILE=Textdatei.dat
    ROWS=`wc -l < $FILE`
    ROW=1
    while [ $ROW -le $ROWS ]; do
        LINE=`sed -n ${ROW}p $FILE`
        # clear
        echo "$LINE"
        echo "-----"
        echo "   (1) Text aendern"
        echo "   (2) Text nicht aendern"
    
        read EINRECORD
        if [ $EINRECORD = "1" ]; then
            echo "Neuer Text:"
            read NTEXT
            echo Eingabe war \'$NTEXT\'
        fi
    
        ROW=`expr $ROW + 1`
    done
    
    Ich habe nur den Eingabeteil, aber nicht das Löschen der zu verwerfenden Zeile und Einfügen der neuen Zeile implementiert.
     
  4. #3 Gott_in_schwarz, 10.03.2008
    Gott_in_schwarz

    Gott_in_schwarz ar0

    Dabei seit:
    22.04.2007
    Beiträge:
    546
    Zustimmungen:
    0
    Ort:
    Niedersachsen
    google search for: nested read
    erstes ergebnis

    benutzter workaround:
    Code:
    while read LINE
    do
    	echo "$LINE"
    	echo "-----"
    	echo "   (1) Text aendern"
    	echo "   (2) Text nicht aendern"
    	read EINRECORD [b]< /dev/tty[/b]
    
    	if [ $EINRECORD = "1" ] ; then echo "Jetzt geht die Abfrage." ; fi
    
    	echo "$LINE" >> Ausgabedatei.dat
    done < Textdatei.dat
     
  5. #4 FrankSchmitz, 11.03.2008
    FrankSchmitz

    FrankSchmitz Jungspund

    Dabei seit:
    23.04.2007
    Beiträge:
    23
    Zustimmungen:
    0
    Great! :)

    Ganz lieben Dank Euch beiden für die Hilfe!
     
  6. #5 FrankSchmitz, 13.03.2008
    FrankSchmitz

    FrankSchmitz Jungspund

    Dabei seit:
    23.04.2007
    Beiträge:
    23
    Zustimmungen:
    0
    READ begrenzt auf 256 Zeichen?

    Mist, eine Sache hätte ich jetzt doch noch.
    Eigentlich habe ich ja fast alles, was ich brauche, aber eben nur fast...

    Mit read will ich bei Bedarf einen neuen Text einfügen. Das haut soweit auch hin.
    Allerdings ist die Eingabe beim read offensichtlich auf 256 Zeichen begrenzt.
    Gibt es irgendeine Möglichkeit oder Workaround die Eingabe zu erweitern? ?(
     
  7. #6 Gott_in_schwarz, 13.03.2008
    Gott_in_schwarz

    Gott_in_schwarz ar0

    Dabei seit:
    22.04.2007
    Beiträge:
    546
    Zustimmungen:
    0
    Ort:
    Niedersachsen
    Also ich habe ja erstmal meinen Mund gehalten, aber ich habe schwere Probleme den Sinn dieser Veranstaltung zu erkennen.

    Zum Beispiel um eine einzelne Zeile in einer Datei zu ändern, könnte man das mit diesem (zugegebenermaßen nicht sonderlich eleganten) sed einzeiler machen:
    Code:
    sed -e "1s/.*/mein neuer text fuer die erste zeile" inFile
    (würde die erste Zeile von inFile durch "mein neuer text..." ersetzen und auf stdout schreiben)
    und das dann halt anstatt dieses obskuren Skripts.. (wobei das natürlich nicht "interaktiv" wäre...)

    zum read-Problem:
    Code:
    read: usage: read [-ers] [-u fd] [-t timeout] [-p prompt] [-a array] [-n nchars] [-d delim] [name ...]
    schonmal versucht einfach "-n $GRÖSSTE_NUMMER_WO_DU_DIR_VORSTELLEN_KANNST" zu benutzen? Wobei mir der Sinn von Zeilen länger als 255 Zeichen auch nicht unbedingt klar ist/wird. Aber nunja.
    Ansonsten könnte man auch direkt den Output von /dev/tty direkt in eine Variable packen: (newlines werden da scheinbar in Leerzeichen umgewandelt..)
    Code:
    foo=$(cat /dev/tty)
    die Eingabe wird dann allerdings nicht durch Enter beendet, sondern durch EOF, also CTRL+D. CTRL+C ginge zwar auch, aber bedeutet eigentlich was anderes.. (es würde die subshell innerhalb dessen "cat /dev/tty" ausgeführt beenden..)
    und btw: wenn das wirklich die Bourne Shell (sh) ist, und nicht die Bourne Again Shell (bash), dann musst du das afaik auch so machen:
    Code:
    foo=`cat /dev/tty`
    aber das ist schon arg "dreckig".

    Ansonsten könntest du auch so eine Schleife bastöln:
    Code:
    #!/bin/bash
    inFile="$1"
    
    for Zeile in $(seq 1 $(cat "$inFile"|wc -l)); do
        echo "Aktuelle Zeile: ${Zeile}"
        echo "Eingabe durch CTRL+D beenden."
        sed -e "${Zeile}s/.*/$(cat /dev/tty|tr '\n' ' ')/" "$inFile" > zomg.tmp && mv -f zomg.tmp "$inFile"
    done
    rm -f zomg.tmp
    :s
    wobei man hier wohl die Eingabe noch optional machen sollte (per if). Außerdem werden Newlines von tr in Leerzeichen umgewandelt, damit sed nicht rummeckert...
    Aber wie gesagt, der Sinn ist mir absolut nicht klar.. (Wofür gibts denn überhaupt Editoren?)
     
  8. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
Thema:

Textdatei zeilenweise editieren

Die Seite wird geladen...

Textdatei zeilenweise editieren - Ähnliche Themen

  1. Textdatei zeilenweise in durchnummerierte Variablen schreiben

    Textdatei zeilenweise in durchnummerierte Variablen schreiben: Hi Leute, ich versuche folgendes Problem zu lösen. Ich möchte eine Textdatei einlesen und den Inhalt jeder Zeile in immer eine neue Variable...
  2. Timestamp an Inhalt einer Textdatei anfügen

    Timestamp an Inhalt einer Textdatei anfügen: Hallo, ich als neuer, unerfahrener Nutzer von Linux und der bash hätte folgende Frage. Und zwar würde ich gerne mit einem command den Zeitstempel...
  3. SSH Login nur mit einer bestimmten IP die in einer Textdatei gespeichert wird

    SSH Login nur mit einer bestimmten IP die in einer Textdatei gespeichert wird: Hallo Ich bin andauernd Opfer einer Brute Force Attacke. Die IPs die fehlerhafte Logins produzieren werden nach dem 3ten Versuch gesperrt. Aber...
  4. Programm für Audiodatei in Textdatei konvertieren

    Programm für Audiodatei in Textdatei konvertieren: Hallo, ich habe für ein Projekt eine Menge Interviews geführt und habe diese digital auf dem Rechner. Allerdings dauert das Abtippen ewig....
  5. nach einem wort in einer textdatei suchen

    nach einem wort in einer textdatei suchen: halloooo ihr lieben, ich hoffe ihr könnt mir weiterhelfen :) ich lernen momentan die skriptsprache shell und alles was dazu gehört. ich soll...