Shell-Guru's: 'sed' or not 'sed'

Hi,

Ein Verzeichnis mit unschönen Dateinamen soll bereinigt werden. Schritt 1: Ersetze alle ‚_‘ oder ‚%20‘ im Namen durch ’ ':

$ echo "01-aaa\_bbb\_ccc-ccc%20ddd%20eee.log" | sed -e 's/\_\|%20/ /g'

Dadurch erhalte ich den bereinigten Namen „01-aaa bbb ccc-ccc ddd eee.log“

Nun möchte ich noch das erste Minuszeichen ersetzen, aber nur, wenn die ersten 2 Chars Ziffern darstellen und sofort darauf ein Minus folgt (wie oben), also alle ‚01-aaa…‘ ersetzen durch ‚01 aaa…‘
Folgendes klappt natürlich (noch) nicht:

echo "01-aaa bbb-ccc ddd.log" | sed -e 's/^[0-9][0-9]-\*/& /'

Ist das mit ‚sed‘ überhaupt machbar?

Nun möchte ich noch das erste Minuszeichen ersetzen, aber nur,
wenn die ersten 2 Chars Ziffern darstellen und sofort darauf
ein Minus folgt (wie oben), also alle ‚01-aaa…‘ ersetzen
durch ‚01 aaa…‘
Folgendes klappt natürlich (noch) nicht:

echo „01-aaa bbb-ccc ddd.log“ | sed -e
‚s/^[0-9][0-9]-*/& /‘

Ist das mit ‚sed‘ überhaupt machbar?

Hi Alexander,
natürlich geht das auch mit sed:

echo "123-sdf 112-aa aa-aa" |
sed 's/\([0-9][0-9]\)-/\1 /'

Erläuterung: die runden Klammern gruppieren im Suchausdruck (2 Ziffern), und \1 im Ersetzausdruck sorgt dafür, dass genau der gefundene Teilstring aus 2 Ziffern wiedervewendet wird…

Bei komplizierteren Ausdrücken würde ich mir auf jeden Fall mal Perl anschauen, dort funktioniert der Umgang mir regulären Ausdrücken noch viel besser.

gruss
bernhard

natürlich geht das auch mit sed:

echo „123-sdf 112-aa aa-aa“ | sed ‚s/([0-9][0-9])-/\1 /‘

Danke Bernhard, für die perfekte Lösung, und dass zum Sonntag :smile:

Bei komplizierteren Ausdrücken würde ich mir auf jeden Fall
mal Perl anschauen, dort funktioniert der Umgang mir regulären
Ausdrücken noch viel besser.

Du hast natürlich Recht, aber mir geht es um’s Verständnis und da komme ich auch bei Perl nicht drumherum. Ich habe heute einige Stunden mit ‚sed‘ und regexp’s verbracht und ärgere mich, dass ich trotz sehr guter Lektüre (http://www.tty1.net/sed-tutorium/html/index.html) die Lösung nicht selbst gefunden habe…

…was auch kein Wunder ist, denn eines ist mir nicht klar:

Wieso wird nur das erste Vorkommnis ersetzt? Du hast ‚^‘ nicht angegeben, so wie ich in diversen Tutorials gelesen habe (Zeilenbeginn).
Was müßte man ändern, um *alle* Vorkommnisse zu ersetzen?

Ist schon eine Wissenschaft für sich. But I’m not sad with sed :smile:

Wieso wird nur das erste Vorkommnis ersetzt? Du hast ‚^‘ nicht
angegeben, so wie ich in diversen Tutorials gelesen habe
(Zeilenbeginn).
Was müßte man ändern, um *alle* Vorkommnisse zu ersetzen?

Hallo Alexander,

das erste Vorkommen wird deswegen ersetzt, weil die Suche im regulären Ausdruck immer am Stringanfang beginnt (und das war ja auch deine Anforderung). Willst du alle Vorkommen ersetzen, musst du mit dem Modifier ‚g‘ wie global (also: s/Suchstring/Erstestzstring/g) arbeiten, deswegen hat es in deiner ersten Mail auch so schön funktioniert.

gruß
bernhard

1 Like

Hi Bernhard,

Willst du alle Vorkommen ersetzen,
musst du mit dem Modifier ‚g‘ wie global (also:
s/Suchstring/Erstestzstring/g) arbeiten, …

Das klärt es auf :wink:

Ich muss zugeben, dass ich den ‚g‘ aus anderen Beispielen übernommen hatte und mich über seine Bedeutung später informieren wollte. Hätte ich auch nur geahnt, dass er so gravierend ist … :wink:

Nochmal Danke für Deine prima Erklärungen