Anzeige:
Ergebnis 1 bis 7 von 7

Thema: sed: zählschleife und werte in Datei schreiben

  1. #1
    dem rovdyr sein gott Avatar von tholle
    Registriert seit
    Jan 2003
    Beiträge
    365

    sed: zählschleife und werte in Datei schreiben

    Hi, ich versuche mich jetzt schon seit mehr als 2 Tagen an einem Problem.

    Folgende Ausgangslage: es gibt eine Datei, in der eine Zahlenkombination (10101010) durch eine aufsteigende Liste Erstetzt werden soll (10101011, 10101012, 10101013, usw.).
    Problem ist, dass die Ausgangszahlenkombination (10101010) in mehreren Zeilen auftaucht und durch Text "umrahmt ist".

    Ich habe nun einen Einzeiler geschrieben, der mir zwar ab 10101010 hochzaehlt, leider aber nicht "schleifenartig" die hochgezaelten Zahlen in der Datei ersetzt. Stattdessen nimmt er nur die letzte Zahl der Schleife, und eretzt alle Pattern (10101010) damit.

    hier mal etwas deutlicher:

    Code:
     i=0; z=10101010; for i in `grep "10101010" test_.txt`; do i=$z; j=$i; let z=$j+1; cat test_.txt|sed "s/10101010/$z/" > test__.txt; echo $z; done
    Erklärung: der erste Teil des Einzeilers baut einen Zähler und schreibt die aktuelle Zahl in "z". Der Zweite Teil soll nun den Wert aus der Variable "z" nehmen, und in test_.txt den ersten gefundenen Pattern (1010101010) ersetzen, und das Ergebnis nach text__.txt schreiben.

    Wie gesagt, funktioniert auch fast, bis auch, dass er jeden Pattern mit der letzten Zahl der Schleife "z" ersetzt.

    test_txt:
    Test Datei 10101010 test
    Noch eine Testzeile 10101010 test.
    10101010
    10101010
    10101010
    10101010
    10101010
    10101010


    test__.txt:
    Test Datei 10101038 test
    Noch eine Testzeile 10101038 test.
    10101038
    10101038
    10101038
    10101038
    10101038
    10101038


    Edit: die Zeilen wurden gekuerzt.. Sind normal 27. ;-)

    Wäre cool, wenn mir hierbei jemand helfen könnte.
    Vielen Dank schon mal dafuer!

    tholle

  2. #2
    Linuxer Avatar von HBtux
    Registriert seit
    Oct 2009
    Ort
    $HOME
    Beiträge
    315
    Kleine Frage zur Aufgabenstellung.....

    Wie soll das Ergebnis Deiner Vorstellung nach den Aussehen?

    Wenn ich die Aufgabe richtig verstanden habe so....
    test_txt:
    Code:
    Test Datei 10101011 test
    Noch eine Testzeile 10101012 test.
    10101013
    10101014
    10101015
    10101016
    10101017
    10101018
    so vielleicht?
    Code:
    >test__.txt; j=10101010; z=$j; while read i; do let z=$z+1; echo $i |sed "s/$j/$z/g" >> test__.txt; done <test_.txt; cat test__.txt
    Ich weiß nicht, ob es 100%ig Deiner Aufgabe entspricht.

    Bitte beachte.
    - Der Schleifenzähler wird auch dann um 1 erhöht, wenn in einer Zeile der String "10101010" nicht gefunden wurde.
    - Und es könnte ein Problem sein, wenn in einer Zeile der String "10101010" mehr als einmal vorkommt.

    Ich weiß aber nicht, ob dies der Fall ist.


    Du kannst ja mal folgenden Text zum Testen nehmen.....
    Code:
    Test Datei 10101010 test
    Noch eine Testzeile 10101010 test.
    In dieser Zeile steht der String 10101010 zweimal 10101010.
    10101010
    10101010
    10101010
    Dafür ist er in dieser Zeile nicht zu finden.
    10101010
    10101010
    10101010
    Viele Grüße
    HBtux

  3. #3
    dem rovdyr sein gott Avatar von tholle
    Registriert seit
    Jan 2003
    Beiträge
    365
    Hi HBtux,

    vielen Dank für den Denkanstoss. Genauso soll das Ergebnis aussehen.

    Klasse! Du hast mir sehr weitergeholfen.

    Viele Grüße,
    tholle

  4. #4
    Linuxer Avatar von HBtux
    Registriert seit
    Oct 2009
    Ort
    $HOME
    Beiträge
    315
    Steht in der Quelldatei exakt in jeder Zeile der Suchsting immer mindestens bzw. nur einmal drinnen?

    Das könntest Du schnell mit den beiden folgenden Befehlen testen...
    Code:
    grep "10101010.*10101010" test_.txt
    In dieser Zeile steht der String 10101010 zweimal 10101010.
    
    grep -v "10101010" test_.txt
    Dafür ist er in dieser Zeile nicht zu finden.
    Viele Grüße
    HBtux

  5. #5
    dem rovdyr sein gott Avatar von tholle
    Registriert seit
    Jan 2003
    Beiträge
    365
    Jepp, in jeder Zeile steht der Pattern nur max 1 mal. Um genau zu sein, ist die "echte" Datei in mehrere Abschnitte unterteilt. In jedem Abschnitt kommt jeweils eine Zeile mit 10101010 vor.
    Das eigentliche Ziel ist, die 10101010 wie schon beschrieben mit steigender Nummerierung zu ersetzen und anschliessend aus jedem Abschnitt eine eigene Datei zu generieren (es sind XML-Abschnitte, die in XML-Dateien abgelegt werden sollen).

    Muss mir jetzt noch was ueberlegen, wie ich die Abschnitte in besagte Dateien extrahiere und diese dateien dann benenne in z.B. 10101010.xml, 10101011.xml, etc.. Aber dafuer hab ich schon eine Idee. Mal schauen, ob es funktioniert. Setz ich mich morgen dran.

    Vielen Dank soweit schon mal.

    tholle

  6. #6
    Linuxer Avatar von HBtux
    Registriert seit
    Oct 2009
    Ort
    $HOME
    Beiträge
    315
    so vielleicht....? (ist zwar keine Einzeiler mehr, aber......)

    Leg mal die folgende Quelldatei an.
    Datei: test1.txt
    Code:
    Test Datei 10101010 test
    Abschnitt1
    bla bla
    Noch eine Testzeile 10101010 test.
    Abschnitt2
    bla blub
    10101010
    Abschnitt3
    Abschnitt3
    10101010
    Abschnitt4
    10101010
    Abschnitt5
    10101010
    Abschnitt6
    10101010
    Abschnitt7
    10101010
    Abschnitt8
    Ende und Schluss
    Und folgendes Script anlegen und dann ausführen...
    Script: test1_xml.sh
    Code:
    #/bin/bash
    
    i=10101010
    # zum Test hier die test_1010 Files vorher wieder löschen.....
    #rm -f test_1010*.xml
    
    while read ZEILE; do
            echo $ZEILE | grep "10101010"  >/dev/null 2>&1
            case $? in
                    0)      i=$((i+1))
                            echo $ZEILE | sed -e "s/10101010/${i}/g" >> test_$i.xml
                            ;;
                    *)      echo $ZEILE >> test_$i.xml
                            ;;
            esac
    done < test1.txt

    Ergebnis....
    Code:
    ls -l test_*.xml
    -rw-r--r--   1 root    root     44 Jan 12 23:08 test_10101011.xml
    -rw-r--r--   1 root    root     55 Jan 12 23:08 test_10101012.xml
    -rw-r--r--   1 root    root     31 Jan 12 23:08 test_10101013.xml
    -rw-r--r--   1 root    root     20 Jan 12 23:08 test_10101014.xml
    -rw-r--r--   1 root    root     20 Jan 12 23:08 test_10101015.xml
    -rw-r--r--   1 root    root     20 Jan 12 23:08 test_10101016.xml
    -rw-r--r--   1 root    root     20 Jan 12 23:08 test_10101017.xml
    -rw-r--r--   1 root    root     37 Jan 12 23:08 test_10101018.xml
    
    cat test_10101011.xml
    Test Datei 10101011 test
    Abschnitt1
    bla bla
    
    cat test_10101012.xml
    Noch eine Testzeile 10101012 test.
    Abschnitt2
    bla blub
    
    usw...
    Viele Grüße
    HBtux

  7. #7
    dem rovdyr sein gott Avatar von tholle
    Registriert seit
    Jan 2003
    Beiträge
    365
    Hey HBtux,

    jepp, genauso solls aussehen. Bin beeindruckt. Sieht im Nachhinein gar nicht so schwer aus, wenn allerdings die noetige Praxis fehlt, strickt man sich dumm und daemlich, bei solchen Skripts. Aber das Tüfteln der letzten Tage war echt lehrreich.

    Vielen Dank,
    tholle

Ähnliche Themen

  1. Myspace flash player
    Von chregu2001 im Forum Anwendungen Allgemein, Software
    Antworten: 6
    Letzter Beitrag: 06.04.08, 19:33
  2. X-Fi Treiber installation unter Suse 10.3
    Von DevilX im Forum Musik
    Antworten: 11
    Letzter Beitrag: 22.10.07, 22:00
  3. lm-sensors Debian kompilier Problem
    Von RTSX im Forum Kompilieren von Kernel und Sourcen
    Antworten: 3
    Letzter Beitrag: 05.07.07, 14:30
  4. lmsensors
    Von ncoder im Forum System installieren und konfigurieren
    Antworten: 22
    Letzter Beitrag: 20.04.03, 11:00
  5. RichTextFormat (RTF) Datei in Postscript Datei umwandeln?
    Von sutterp im Forum Anwendungen Allgemein, Software
    Antworten: 6
    Letzter Beitrag: 10.09.02, 07:16

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •