sed, leerzeichen durch komma ersetzen

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von pamo12, 21.08.2007.

  1. pamo12

    pamo12 Grünschnabel

    Dabei seit:
    21.08.2007
    Beiträge:
    5
    Zustimmungen:
    0
    ich hab ein skript, dass in Textdateien [[Foo:ABC XYZ]] durch {Bar:ABC XYZ} ersetzt:

    #!/bin/sh

    for i in dir/*.txt; do
    echo $i
    if [ ! -f "$i" ]; then
    continue;
    fi
    cat "$i" | sed 's/\[\[Foo:\([-A-Za-z0-9_ ]*\)\]\]/{Bar:\1}/g' > "$i.new";
    mv "$i" "$i.bak" && mv "$i.new" "$i";
    done​

    bei einem zweiten punkt komme ich leider nicht weiter. es geht darum, in allen Ausdrücken wie {Bar:ABC XYZ} Leerzeichen durch Kommas zu ersetzen. Dabei ist es mir egal, ob es noch in diesem Skript oder in einem zweiten verwirklicht wird. Für Ideen bin ich sehr dankbar! :hilfe2:
     
  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. #2 jürgen, 21.08.2007
    jürgen

    jürgen Grünschnabel

    Dabei seit:
    22.05.2007
    Beiträge:
    8
    Zustimmungen:
    0
    Dies hier ist eine Möglichkeit:
    Code:
    cat "$i" | sed 's/\[\[Foo:\([-A-Za-z0-9_ ]*\)\]\]/{Bar:\1}/g' [B][COLOR="Green"]| tr ' ' ',' [/COLOR][/B]> "$i.new";
    
     
  4. smg

    smg Regex Fetischist

    Dabei seit:
    20.05.2007
    Beiträge:
    195
    Zustimmungen:
    0
    Ort:
    /home/stephan/
    jürgen: UUOC das geht auch ohne.
    _Dein_ Code berichtigt:
    Code:
    sed 's/^\[\[Foo:\(.*\)\]\]$/{Bar:\1}/g'  "$i" | tr ' ' ',' > "$i.new";
     
  5. pamo12

    pamo12 Grünschnabel

    Dabei seit:
    21.08.2007
    Beiträge:
    5
    Zustimmungen:
    0
    danke für eure mühen. also, das problem an der sache ist, dass diese expressions [[Foo:ABC XYZ]] {Bar:ABC XYZ} nur teile dieser .txt Dateien sind. Und nur in diesen Ausdrücken sollen die Leerzeichen ersetzt werden, nicht im restlichen Text...
     
  6. keks

    keks nicht 1337 genug

    Dabei seit:
    17.01.2007
    Beiträge:
    401
    Zustimmungen:
    0
    Ort:
    Hessen
    ;) (sorry konnte mir es eben nicht verkneifen)
     
  7. #6 Wolfgang, 21.08.2007
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Wenn es nur um die Leerzeichen innerhalb von Bar:ABC XYZ geht, dann setz einfach eine zweite Ersetzung dahinter.
    Code:
    s/\(Bar:[^[:space:]]*\)[[:space:]]\+\([^[:space:]]*\)/\1,\2/g
    
     
  8. pamo12

    pamo12 Grünschnabel

    Dabei seit:
    21.08.2007
    Beiträge:
    5
    Zustimmungen:
    0
    also sieht das insgesamt dann so aus?

    Code:
    #!/bin/sh
    
    for i in dir/*.txt; do
    echo $i
    if [ ! -f "$i" ]; then
    continue;
    fi
    cat "$i" | sed 's/\[\[Foo:\([-A-Za-z0-9_ ]*\)\]\]/{Bar:\1}/g' | sed 's/\{Bar:[^[:space:]]*\)[[:space:]]\+\([^[:space:]]*\)/\1,\2/g' > "$i.new";
    mv "$i" "$i.bak" && mv "$i.new" "$i";
    done
    dann kommt der fehler: char 67: invalid preceding regular expression :think:
     
  9. #8 Wolfgang, 21.08.2007
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Code:
    ...sed 's/[b]\{[/b]Bar...
    
    Ist falsch.
    Die geschweifte Klammer darf hier nicht escaped werden.
    Wird wie ein normales Zeichen behandelt.
    Außerdem wurde schon gesagt, dass das cat hier sinnlos ist.
    Auch die zweite Pipe ist nicht nötig, da du beide Befehle durch Semikola getrennt hintereinander schreiben kannst. Oder ein zweites -e 's...' verwenden, falls es nicht GNU sed ist.

    Gruß Wolfgang
     
  10. pamo12

    pamo12 Grünschnabel

    Dabei seit:
    21.08.2007
    Beiträge:
    5
    Zustimmungen:
    0
    danke Wolfgang, ich hoffe dich nicht zur verzweiflung zu bringen. aktuelle version des skripts:

    Code:
    #!/bin/sh
    
    for i in ./*.txt; do
    echo $1
            if [ ! -f "$i" ]; then
                    continue;
            fi
    cat "$i" | sed 's/\[\[Category:\([-A-Za-z0-9_ ]*\)\]\]/{addlabel:\1}/g';
    sed 's/{add-label:[^[:space:]]*}[[:space:]]\+\([^[:space:]]*\)/\1,\2/g' > "$i.new";
    mv "$i" "$i.bak" && mv "$i.new" "$i";
    done
    
    der erscheinende Fehler:
    Code:
    sed: -e Ausdruck #1, Zeichen 65: invalid reference \2 on `s' command's RHS
    ?(

    (das cat steht, weil ich beim testen gern sehe was ich mache :))
     
  11. #10 Wolfgang, 21.08.2007
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Wenn du $i an sed verfütterst, passiert äußerlich genau das Gleiche.,nur dass du einen Prozess nebst Pipe sparst.
    Sprich: Es ist dort sinnfrei!

    Zu deinem Fehler:
    Wenn du schon eine zweite Backreferenz verwendest, musst du sie im Suchteil auch erzeugen!
    In deinem sed fehlen die Klammern um den ersten Teil, deshalb gibt es bei dir auch keine \2 im Ersetzenteil.


    Gruß Wolfgang
     
  12. pamo12

    pamo12 Grünschnabel

    Dabei seit:
    21.08.2007
    Beiträge:
    5
    Zustimmungen:
    0
    den zweiten teil des skripts hab ich mal als befehl auf eine entsprechend vorbereitete datei angewendet, also folgendes:

    Code:
    cat test.txt | sed 's/{add-label:\([^[:space:]]*}[[:space:]]\)\+\([^[:space:]]*\)/\1,\2/g'
    
    eingangstext:
    Code:
    bla bla bla bla
    {add-label:Text Text}
    ergebnis:
    Code:
    bla bla bla bla
    {add-label:Text Text}
    das erwartete ergebnis, die leerzeichen im {add-label:}- ausdruck zu entfernden blieb also aus.

    :headup:
     
  13. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  14. #12 Wolfgang, 22.08.2007
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Dein regulärer Ausdruck ist auch falsch!
    Schau nochmal selber genau hin.
    Dein \1 enthält nämlich Beliebige Zeichen die nicht auf Space matchen, gefolgt von einer geschweiften Klammer, gefolgt von einem Space!
    Das ist aber nicht was du willst. Die schließende geschweifte Klammer sollte doch an das Ende. Im Grunde brauchst du die beiden geschweiften Klammern nicht!


    Gruß Wolfgang
     
  15. #13 jürgen, 24.08.2007
    jürgen

    jürgen Grünschnabel

    Dabei seit:
    22.05.2007
    Beiträge:
    8
    Zustimmungen:
    0
    das ist mir auch klar, dass das kompakter geht
    aber ich sehe es nicht als zielführend an, wenn ich einen (hoffentlich) ausgetesteten Skriptteil einfach "just for fun" durch einen anderen ersetze (den ich dann ja auch wieder testen müsste 8)), obwohl die Fragestellung (in diesem Falle die Ersetzung von blank durch Komma) eine ganz andere war
     
Thema: sed, leerzeichen durch komma ersetzen
Besucher kamen mit folgenden Suchen
  1. unix sed leerzeichen ersetzen

    ,
  2. sed leerzeichen ersetzen

Die Seite wird geladen...

sed, leerzeichen durch komma ersetzen - Ähnliche Themen

  1. Ordnerdurchlauf for-Schleife & find MIT Leerzeichen

    Ordnerdurchlauf for-Schleife & find MIT Leerzeichen: Hallo alle zusammen :), ich bin ein Neuling in Sachen shellscriping und schreibe zur Zeit an einem kleinen Script und hänge seit Tagen etwas in...
  2. Leerzeichen durch "_" ersetzen

    Leerzeichen durch "_" ersetzen: Hi, ich sitze seit 5min an einen total trivialen Problem. Ich möchte im Inhalt der Variable $long alle Leerzeichen (" ") durch ein "_"...
  3. Suche in Datei doppelte Wörter in jeder Zeile bis zum dritten Leerzeichen...

    Suche in Datei doppelte Wörter in jeder Zeile bis zum dritten Leerzeichen...: Ich habe eine Textdatei in der ich Einträge bis zum 3. Leerzeichen mit den restlichen Zeilen (auch nur bis 3. Leerzeichen) vergleichen muss und...
  4. Leerzeichen, Großbuchstaben, HTML Tags entfernen mittels SED

    Leerzeichen, Großbuchstaben, HTML Tags entfernen mittels SED: Hallo zusammen. Ich habe folgendes Anliegen: Ich habe eine HTML Datei mit entsprechenden Tags usw. . Diese möchte ich in eine normale Textdatei...
  5. Textdatei / AWK / Leerzeichen - Problem

    Textdatei / AWK / Leerzeichen - Problem: Hi liebes Forum, vielleicht könnt ihr mir bei einer kleinen Shell-Geschichte helfen, da ich kein Programmierer bin, und auf der Shell noch recht...