Datei zeilenweise testen

A

Andrea

Routinier
Hallo,

ich moechte in einer Datei jede Zeile daraufhin testen, ob ein bestimmter String vorkommt.

Bisher habe ich mit verschiedenen Varianten von while und for - Schleifen rumprobiert, nur ich habe es nicht hinbekommen, wirklich EINE Zeile in meiner Schleifenvariable zu haben.
Daher geht dann
if [[ -n $(echo $i | grep -q wort) ]]; then
schief, da Wort irgendwo in meiner Datei vorkommt.

Wie bekomme ich denn eine Datei wirklich zeilenweise nacheinander in eine Variable geschrieben, so dass ich testen kann, ob mein String in dieser Zeile vorkommt?

Danke schonmal,
Andrea
 
Hallo Andrea

Was möchtest du genau? Ich verstehe die Problemstellung nicht genau, 'grep' prüft eine Datei doch zeilenweise auf einen bestimmten String...

Gruss
d22
 
Am besten wäre es du gibst ein Beispiel für die Eingabe und eines für die gewünschte Ausgabe.
 
Inhalt der Datei "fmttext":
Lorem ipsum dolor sit amet,
consectetuer adipiscing
elit. Vivamus malesuada
ornare quam. Nunc quis lorem
a ligula rutrum eleifend. Sed
quam. Quisque condimentum
sagittis sem. In hac
habitasse platea dictumst. In
erat. Fusce libero odio,
consequat vitae, convallis
sed, congue id, dui. Nulla
lorem lorem, fermentum
commodo, vulputate eget,
imperdiet eget, odio. Nulla
non diam eget nunc dapibus
rutrum. Cras nisi. Nulla
semper elit rutrum
nisi. Mauris pretium metus ut
justo. In non pede. Praesent
sollicitudin risus vel
urna. Donec in nisl. Praesent
nisl elit, suscipit vitae,
viverra sed, laoreet eu,
massa. In sapien dolor,
consectetuer at, ornare ac,
laoreet ac, velit. Phasellus
non nunc in velit varius
nonummy. Vestibulum ultrices
nulla nec diam. In lobortis
sem tempor turpis.

Vestibulum sed felis. In vel
eros. Maecenas hendrerit
eleifend augue. Praesent
magna dolor, malesuada et,
lobortis ac, fermentum
non, metus. Nulla
facilisi. Vestibulum porta
odio at felis. Donec porta
lectus vel justo. Nulla
vulputate orci eget arcu
pulvinar malesuada. Curabitur
accumsan condimentum
massa. Nam non nisi. In non
neque.
Code:
user on ZPC72983:/home/user >nl fmttext | grep con
liefert sehr komfortabel

Code:
     2  consectetuer adipiscing
     6  quam. Quisque condimentum
    10  consequat vitae, convallis
    11  sed, congue id, dui. Nulla
    25  consectetuer at, ornare ac,
    42  accumsan condimentum
 
Hallo
Zumindest GNU grep kennt auch die Option -n.
Das spart eine useless use ... ;)
Code:
grep -n "suchwort" Datei

Du kannst natürlich auch read zum zeilenweisen Verarbeiten nehmen, und dann entsprechende Aktionen ausführen.

Code:
while read variable;
do
if ...
else
fi < Datei

Gruß Wolfgang
 
Also, eigentlich geht es darum, das ich eine Datei habe, in der nach der Bearbeitung die urspruenglichen Zeilen drin stehen, sowie einige die ich ersetzt habe oder hinzugefuegt hab:

Angenommen, ich will 1a,2b,13c in meiner Datei haben und die urspruengliche sieht so aus:

hallo
13d
test

dann soll mein Ergebnis

hallo
1a
2b
13c
test

sein.

Da ich nicht viel Ahnung von Shellskripten habe (und die auch nicht oft benutze), dachte ich, ich teste halt jede Zeile, ob ich sie brauche oder nicht.

Und mein eigentliches Problem ist, dass ich nicht weiss, wie ich das hier in einem Shellskript formuliere:

wenn [aktuelle zeile enthaelt 13]
ersetze ganze zeile durch 13c.

Ausserdem muessen 1a, 2b, 13c direkt hintereinander stehen.

Das grep die ganze Datei zeilenweise prueft, ist mir schon klar. Nur brauche ich halt auch alle anderen Zeilen.

Wie bekomme ich denn in dem Beispiel mit while wirklich nur eine Zeile?

while read variable;
do
if [[ -n $(echo $variable | grep -q test) ]]; then
echo $variable
fi
done < file

sollte mir doch die zeile in der test steht ausgeben?
Das tut es aber nicht, es gibt gar nichts aus.

Ich hab auch schon alternativ -z statt -n probiert. Damit bekomme ich aber alle Zeilen der Datei ausgegeben.

Sorry, eventuell ist das etwas konfus geschrieben, aber ich sitze an diesem Mist seit 8 Stunden dran und bin relativ verzweifelt...
 
Hallo
benutzt du die Bash als Shell?
Vorschlag als ungetesteten Schnellschuss:
Code:
$ cat test
test 
hallo
13d
test
14d
15d
test
more

$ sed -e '/13d/s/13d/1a\n2b\n13c/' test
test 
hallo
1a
2b
13c
test
14d
15d
test
more
Willst du das direkt in der Datei ändern, geht für GNU sed die Option -i.
Sonst hilf dir mit temporären Dateien.

Gruß Wolfgang
 
Hallo Andrea,

mh, nachdem ich das Problem gesehen habe, ist mir auch sed in den Sinn gekommen.
Vielleicht hilft Dir das ja weiter ...

Code:
#!/bin/bash


echo "Bitte SuchWort eingeben :"; read SuchWort
echo "Suche $SuchWort in Datei $1"
Zeile=`nl --body-numbering=a $1 | grep $SuchWort | awk {'print $1 '}`
echo "Fündig geworden in Zeile : $Zeile"
echo "Bitte Insert Eingeben :" ; read insert
sed ''$Zeile'i'$insert'\' $1 > asdf.txt

exit

Natürlich kann man den code auch noch mit diversen while Schleifen hübsch machen.

:gn8:
oemet
 
Danke fuer die Antworten!

Allerdings hatte ich aehnliches auch schon probiert, und bin nicht weitergekommen.

Zu dem 1. Vorschlag:
Ich weiss leider nicht das ich 13d ersetzen muss, sondern nur, dass 13* eventuell drin vorkommt.
sed -e '/13*/s/13*/1a\n2b\n13c/' test
ersetzt aber bei mir die Zeile mit der 13 gar nicht mehr.

Zu dem 2. Vorschlag:
Dabei wird bei mir das $zeile nicht durch $insert ersetzt, sondern $insert vor $zeile eingefuegt?


Das ganze, was ich machen will, sieht bei mir ungefaehr so aus:

Wenn wort in der Datei vorkommt,
loesche bestimmte Zeilen und ersetze wort durch wort2

wenn wort nicht vorkommt
haenge was an die Datei an.
(den Teil bekomme ich hin :-) )

(hatte ich am Anfang nicht geschrieben, weil es ja immer Haue gibt, wenn man nach der ganzen loesung fragt und nicht nach der Stelle wo man haengt)

Wenn ich das jetzt in ein Shellskript uebersetzen will, haengt es bei mir erstens beim Aufruf von sed daran, dass ich nicht weiss, wie ich den kompletten Text mit Ersetzungen wieder in eine Datei bekomme (egal ob temporaer oder die originale) und zweitens wie ich "ersetze die ganze Zeile in der wort vorkommt durch was anders" formulieren muss.
 
Hallo,
Ich weiss leider nicht das ich 13d ersetzen muss, sondern nur, dass 13* eventuell drin vorkommt.
sed -e '/13*/s/13*/1a\n2b\n13c/' test
ersetzt aber bei mir die Zeile mit der 13 gar nicht mehr.
Das sollte klappen:
sed -e '/.*13.*/s/13.*/1a\n2b\n13c/' test

Wenn wort in der Datei vorkommt,
loesche bestimmte Zeilen und ersetze wort durch wort2
Hier sollte dies dein Problem lösen:
'sed -e 's/.*gesuchtesWort.*/wort2/g' test'

//edit:
Wie du siehst ist 'sed' etwas ganz wunderbares ;)
Ich empfehle dir folgende Links einmal anzuschauen, insbesondere das pdf, hat mir sehr viel gebracht...
http://www.ostc.de/sed.pdf
http://www-128.ibm.com/developerworks/linux/library/l-sed1.html

Gruss
d22
 
Zuletzt bearbeitet:

Ähnliche Themen

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

Queue für copy Script

Last mit etc/passwd anzeigen lassen

Mehrere Dateien umwandel?

grep und Variablen

Zurück
Oben