Datei zeilenweise testen

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von Andrea, 22.11.2006.

  1. Andrea

    Andrea Routinier

    Dabei seit:
    01.12.2003
    Beiträge:
    418
    Zustimmungen:
    0
    Ort:
    Bielefeld
    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
     
  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. dizzgo

    dizzgo Lernbereite Riesenratte

    Dabei seit:
    04.08.2005
    Beiträge:
    573
    Zustimmungen:
    0
    Ort:
    /ch/sg///
    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
     
  4. #3 supersucker, 22.11.2006
    supersucker

    supersucker Foren Gott

    Dabei seit:
    21.02.2005
    Beiträge:
    3.873
    Zustimmungen:
    0
    Am besten wäre es du gibst ein Beispiel für die Eingabe und eines für die gewünschte Ausgabe.
     
  5. #4 Peregrine, 22.11.2006
    Peregrine

    Peregrine Honorarkonsul

    Dabei seit:
    03.08.2006
    Beiträge:
    338
    Zustimmungen:
    0
    Ort:
    München, Bayern, Germany
    Inhalt der Datei "fmttext":
    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
    
     
  6. #5 Wolfgang, 22.11.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    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
     
  7. Andrea

    Andrea Routinier

    Dabei seit:
    01.12.2003
    Beiträge:
    418
    Zustimmungen:
    0
    Ort:
    Bielefeld
    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...
     
  8. #7 Wolfgang, 22.11.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    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
     
  9. oemet

    oemet Grünschnabel

    Dabei seit:
    21.06.2004
    Beiträge:
    2
    Zustimmungen:
    0
    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
     
  10. Anzeige

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

    Andrea Routinier

    Dabei seit:
    01.12.2003
    Beiträge:
    418
    Zustimmungen:
    0
    Ort:
    Bielefeld
    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.
     
  12. #10 dizzgo, 23.11.2006
    Zuletzt bearbeitet: 23.11.2006
    dizzgo

    dizzgo Lernbereite Riesenratte

    Dabei seit:
    04.08.2005
    Beiträge:
    573
    Zustimmungen:
    0
    Ort:
    /ch/sg///
    Hallo,
    Das sollte klappen:
    sed -e '/.*13.*/s/13.*/1a\n2b\n13c/' test

    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
     
Thema:

Datei zeilenweise testen

Die Seite wird geladen...

Datei zeilenweise testen - Ä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. Prblem mit zeilenweises auslesen von Datei und schreiben nach mysql

    Prblem mit zeilenweises auslesen von Datei und schreiben nach mysql: Hallo Eventuell kann mir jemand bei meinem Problem helfen. Ich habe mich irgendwie total verrannt und komme nicht weiter. Die folgende...
  3. in eine Datei zeilenweise reinschreiben

    in eine Datei zeilenweise reinschreiben: Hallo, bin gerade am Verzweifeln, denn alles, was sonst immer funktionierte geht plötzlich nicht mehr. mein Code: cat table1 | while read...
  4. Datei zeilenweise schreiben

    Datei zeilenweise schreiben: Hallo, ist es mit Bash Mitteln irgendwie möglich, eine Datei mit schreibenden Zugriff zu öffnen, Zeile für Zeile rausschreiben und sie dann...
  5. Zeilenweise Mittelwert aus 3 Dateien

    Zeilenweise Mittelwert aus 3 Dateien: Hallo liebe Unix-Community! Als vollkommener Linux Neuling habe ich starke probleme ein wohl relativ einfaches Skript zu schreiben. Ich...