sed, leerzeichen durch komma ersetzen

P

pamo12

Grünschnabel
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:
 
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";
 
jürgen: UUOC das geht auch ohne.
_Dein_ Code berichtigt:
Code:
sed 's/^\[\[Foo:\(.*\)\]\]$/{Bar:\1}/g'  "$i" | tr ' ' ',' > "$i.new";
 
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...
 
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
 
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:
 
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
 
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 :))
 
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
 
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:
 
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
 
jürgen: UUOC das geht auch ohne.
_Dein_ Code berichtigt:
Code:
sed 's/^\[\[Foo:\(.*\)\]\]$/{Bar:\1}/g'  "$i" | tr ' ' ',' > "$i.new";

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
 
Zurück
Oben