Textdatei zeilenweise editieren

F

FrankSchmitz

Jungspund
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
 
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.
 
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
 
Great! :)

Ganz lieben Dank Euch beiden für die Hilfe!
 
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? ?(
 
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?)
 

Ähnliche Themen

Summe von Zahlen in einer Zeilen bilden

Textdatei zeilenweise in durchnummerierte Variablen schreiben

nach einem wort in einer textdatei suchen

Sed: Bestimmtes Feld einer "Zeile mit mehreren Feldern" ergänzen

Shellskript - Fehler in Cron

Zurück
Oben