Anzeige:
Ergebnis 1 bis 9 von 9

Thema: Problem in Shell-Skript, mit sed wahrscheinlich

  1. #1
    Registrierter Benutzer
    Registriert seit
    19.06.2003
    Beiträge
    27

    Unhappy Problem in Shell-Skript, mit sed wahrscheinlich

    Hallo

    Ich habe ein Problem mit meinen Skript.

    Ich möchte von einer großen Datei(list1) in bestimmten Zeilen das Zeichen _ durch einen . ersetzten und in der Datei list2 ausgeben lassen.
    In welchen Zeilen dies geschehen soll habe ich in der Datei zz.

    Von Zeit zu Zeit funktioniert dieses Skript, ein anderes Mal hingegen gibt es einfach eine leere Datei aus. Ich weiß deshalb nicht was genau los ist.

    Vielleicht könntet ihr es euch mal anschauen?


    Der Inhalt der Datei zz sind nur diese Zeilenangaben
    --------------zz------------------------
    214
    334
    337
    361
    -------------zz--------------------------


    Mein Bash-Skript sieht nun wie folgt aus.

    ---------------------02.make---------------
    #!/usr/local/bin/bash


    #Um die ursprünliche zu sichern
    /bin/cp list1 list2

    #Ende der While-Schleife
    end=$(nl zz | tail -n 1 | awk '{print $1}')
    e=0

    while [ $e -lt $end ]; do
    e=$[$e+1]
    a=$(sed -n $e'p' zz)
    sed $a\s/_/./g list2 | tee list2
    done

    --------------------02.make----------------

    Hat jemand eine Idee, was falsch ist oder wie ich dies komplett mit sed realiserien könnte

    Ruga

  2. #2
    Registrierter Benutzer
    Registriert seit
    13.11.2001
    Ort
    München
    Beiträge
    34
    sed s/\_/\./g list1 > list2

    sollte es tun ... oder mit

    tr

  3. #3
    Registrierter Benutzer
    Registriert seit
    19.06.2003
    Beiträge
    27

    Exclamation Wie gebe ich die Zeile an?

    Danke für die Antwort

    Aber wie gebe ich bei deinen die Zeile an in der es ersetzt werden soll?

    Ich will ja nicht in jeder den _ durch einen . ersetzen.


    Ruga

  4. #4
    Registrierter Benutzer
    Registriert seit
    13.11.2001
    Ort
    München
    Beiträge
    34
    axo

    dann musst du eine extra "sedscript datei schreiben"

    30,50/{
    s/\_/\./g
    }

    samit werden nur die _ durch . in den zeilen 30-50 ersetzt

    es geht natürlich auch mit regex

    /regex/,/regexdie2./{
    s/\_/\./g
    }

  5. #5
    Registrierter Benutzer
    Registriert seit
    19.06.2003
    Beiträge
    27

    Hilft mir nicht weiter

    Hallo

    Es kann sein dass ich einfach zu dumm bin

    aber mit den ersten Vortschlag kann ich nichts anfangen, da ich wie schon erwähnt nur in bestimmten einzelnen Zeilen (die in einer Datei angeben sind) etwas ändern will.

    und mit dem zweiten weiß ich auch nicht wie ich das machen könnte


    Ruga

  6. #6
    Registrierter Benutzer
    Registriert seit
    13.11.2001
    Ort
    München
    Beiträge
    34
    sorry ... vieleicht hab ich mich etwas zu kur6z gefasst

    also du erzeugst eine datei z.b sedscript
    da schreibst du rein

    30,50{
    s/\_/\./g
    }

    die 1. (30) zahl steht für die erste zeile ab der du bearbeiten willst
    die 2. (50) zahl steht für die letzte zeile bis der du bearbeiten willst (kann weggelassen werden (dann ersetzt er nur die 30. zeile)

    { begin des kommandos das für zeilen 30 bis 50 ausgeführt werden soll

    s = ersetzen
    g = ersetzen von allen vorkommen (ohne g wird nur das erste _ durch ein . ersetzt)

    }ende

    zwischen { und }
    kannst du natürlich noch mehr kommandos schreiben

    ich hoffe das hilft dir weiter
    mit sed kannst du natülich noch mehr machen - hier ne kleine auswahl
    http://www.student.northpark.edu/pem...d/sed1line.txt

  7. #7
    Registrierter Benutzer
    Registriert seit
    19.06.2003
    Beiträge
    27

    Hab schon verstanden

    Was dein ersten Vorschlag bedeutet habe ich schon verstanden. ich will aber keine Bereiche ersetzen, sondern nur einzelne Zeichen in Zeilen.

    Das hatte ich mit meinen Skript auch schon.

    Mein Problem ist nur dass es ab und zu funktioniert, ein anderes Mal allerdings eine leere Seite ausgibt.

    Ruga

  8. #8
    Registrierter Benutzer
    Registriert seit
    13.11.2001
    Ort
    München
    Beiträge
    34
    axo ....


    sed $a\s/_/./g list2 | tee list2


    ich denke mal das es daran liegt.
    du liest di list2 aus und überschreibst sie gleichzeitig

    sed $a\s/_/./g list1 | tee list2
    solltes besser klappen von list1 lesen und nach list2 schreiben
    (dann kannst du dir auch copy sparen)


    #!/usr/local/bin/bash

    for i in $(cat zz)
    do
    sed $i\s/_/./g list1 | tee list2
    done

    sollte auch klappen da der for befehl immer nur ein wort liest

  9. #9
    Registrierter Benutzer
    Registriert seit
    19.06.2003
    Beiträge
    27

    Funktioniert

    Jetzt funktioniert es

    Wahrscheinlich lag es am gleichzeitigen lesen und schreiben der Datei


    mit

    end=$(nl zz | tail -n 1 | awk '{print $1}')
    e=0
    while [ $e -lt $end ]; do
    e=$[$e+1]
    a=$(sed -n $e'p' zz)
    sed $a\s/_/./g list1 | tee list2
    cp list2 list1
    done

    funktioniert es jetzt

    Ich verwende allerdings jetzt lieber deine for-Schleife weil die um einiges eleganter wirkt.

    Allerdings kann man sich das cp nach sed nicht sparen, da sonst jedes mal von der gleichen und nicht von der Ersetzten gelesen würde.

    Nochmals danke für die Hilfe

    Ruga

Lesezeichen

Berechtigungen

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