was ist hier an sed falsch ?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Voyager_MP
Beiträge: 628
Registriert: 22.06.2004 10:04:07
Wohnort: Aachen

was ist hier an sed falsch ?

Beitrag von Voyager_MP » 08.02.2006 09:36:51

Code: Alles auswählen

#!/bin/bash
#set -o xtrace

for filein in "$@"; do
  file=`echo "$filein" | sed \
            -e 's/[A-Z]/[a-z]/g' \
            -e 's/[öÖ]/oe/g' \
            -e 's/[äÄ]/ae/g' \
            -e 's/[üÜ]/ue/g' \
            -e 's/ß/ss/g' \
            -e 's/[()]/-/g' \
            -e 's/\[/-/g' -e 's/\]/-/g' \
            -e 's/%[0-9A-F][0-9A-F]/_/g' `
  test "$filein" = "$file" || mv "$filein" "$file"
done
Hi, irgendwie hat sed mit A-Z probleme. hat einer eine idee ?
Gruß Michel

fuzzy
Beiträge: 1021
Registriert: 04.10.2003 12:15:52

Beitrag von fuzzy » 08.02.2006 11:46:55

Hallo Voyager_MP,
ich hätte erstmal nur diese Ideen:

Code: Alles auswählen

fuzzy@sid:/tmp$ echo HallO | sed 'y/AHLO/ahlo/'
hallo
fuzzy@sid:/tmp$ echo HallO | tr "A-Z" "a-z"    
hallo
Gruß fuzzy

ToPeG
Beiträge: 437
Registriert: 14.04.2004 00:42:06

Beitrag von ToPeG » 08.02.2006 18:38:28

die Stelle

Code: Alles auswählen

's/[A-Z]/[a-z]/g'
kann so nicht funktionieren, da "s" immer eine Zeichenfolge durch eine andere ersetzt (und in dem Fall würden alle zeichen von A bis Z Zeichen durch "[a-z]" ersezt). richtiger wäre hier "y" da damit ein gefundenes Zeichen der Suchliste duch ein korresponierendes Zeichen in der Ersetzungsliste tauscht. Allso richtig wäre

Code: Alles auswählen

'y/[A-Z]/[a-z]/g'

Benutzeravatar
degen
Beiträge: 93
Registriert: 29.01.2005 16:49:31
Wohnort: Lößnitz

Beitrag von degen » 08.02.2006 18:47:42

Hallo,

wenn ich das richtig verstehe möchtest du alle Großbuchstaben in Kleinbuchstaben wandeln.

Code: Alles auswählen

tux@notebook:~$ echo HALLO | sed -e 's/[A-Z]/\L&/g'
hallo
tux@notebook:~$  
Zur Erklärung:
\Lwandelt alle Ersetzungen in Kleinbuchstaben um. ( \U für Wandlung in Großbuchstaben, \E beendet die Umwandlung durch \L oder \U )

Das & wird verwendet wenn man nicht genau definierte Zeichenfolgen sucht und verändern möchte.

mfg degen
Irren ist menschlich. Aber wenn man richtig Mist bauen will, braucht man einen Computer.

Benutzeravatar
meandtheshell
Beiträge: 4054
Registriert: 14.01.2005 17:51:30

Beitrag von meandtheshell » 13.02.2006 11:48:04

Code: Alles auswählen

max@pc1:~/misc/test$ echo das mit lower und upper case war mir neu | sed 's/[[:alpha:]]/\U&/g'
DAS MIT LOWER UND UPPER CASE WAR MIR NEU
wo gibt es zu den syntax elementen mehr info - Standard Reguläre Ausdrücke sind das ja nicht - sind sie es doch?

markus

fuzzy
Beiträge: 1021
Registriert: 04.10.2003 12:15:52

Beitrag von fuzzy » 13.02.2006 12:30:14

@meandtheshell
das kannte ich auch nicht, aber nachdem ich es bei einem freebsd-Sytem getestet hatte, bin ich "sehr vorsichtig" geworden :wink:

Code: Alles auswählen

fuzzy@free:/tmp$ echo HALLO | sed -e 's/[A-Z]/\L&/g' 
LHLALLLLLO

fuzzy@free:/tmp$ echo das mit lower und upper case war mir neu | sed 's/[[:alpha:]]/\U&/g'
UdUaUs UmUiUt UlUoUwUeUr UuUnUd UuUpUpUeUr UcUaUsUe UwUaUr UmUiUr UnUeUu
Gruß fuzzy

Benutzeravatar
meandtheshell
Beiträge: 4054
Registriert: 14.01.2005 17:51:30

Beitrag von meandtheshell » 13.02.2006 12:50:57

ist nicht notwendig wenn nur ein Kommando übergeben wird

Was den Rest angeht werde ich gleich verrückt - wenn ich wenigstens wüsste wo ich für eine Erklärung von usw. suchen muss.

Die sed manpage und das texinfo manual ist natürlich auch ein Schuß in den Ofen. WTF ...

markus

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 13.02.2006 13:45:38

zu dem "\L" und "\U" habe ich auch nichts gefunden, das dürfte aber eine gnu extension sein (auf sun und aix funktioniert das auch nicht).

Ich würde überhaupt tr verwenden:

Code: Alles auswählen

echo hallo | tr a-z A-Z
mit standard sed kommandos ist das ja etwas umständlich :) :

Code: Alles auswählen

echo hallo | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'
vielleicht gibt es auch noch einen anderen Trick, das über sed zu transformieren, ich kenne aber keinen

Gruß
gms

Benutzeravatar
meandtheshell
Beiträge: 4054
Registriert: 14.01.2005 17:51:30

Beitrag von meandtheshell » 13.02.2006 14:22:15

gms hat geschrieben:zu dem "\L" und "\U" habe ich auch nichts gefunden, das dürfte aber eine gnu extension sein
kämpfen bis zum umfallen - nicht locker lassen ... manchmal hilft es
http://www.ptug.org/sed/sedfaq.htm ----> 6.8.3 ----> D

"tr" ist auch gut aber ich denke ich werde mir das mit sed merken den sed ist dann doch das mächtigere Tool als "tr"

markus

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 13.02.2006 17:35:23

meandtheshell hat geschrieben: kämpfen bis zum umfallen - nicht locker lassen ... manchmal hilft es
http://www.ptug.org/sed/sedfaq.htm ----> 6.8.3 ----> D
wow, du bist aber hartnäckig :)
meandtheshell hat geschrieben: "tr" ist auch gut aber ich denke ich werde mir das mit sed merken den sed ist dann doch das mächtigere Tool als "tr"
kannst dir ja beide merken :)

persönlich habe ich eine vorliebe für Perl, dort brauche ich keine gnu extensions, es ist noch mächter als "sed" und funktioniert auf allen unixartigen Systemen gleich.

Code: Alles auswählen

file=`echo "$filein" | \
  perl -pe '$_=lc ; \
            s/ö/oe/gi;s/ä/ae/gi;s/ü/ue/gi;s/ß/ss/g;\
            s/[\(\)\[\]]/-/g;\
            s/%[0-9a-f]{2}/_/g;'`
lg
gms

Benutzeravatar
degen
Beiträge: 93
Registriert: 29.01.2005 16:49:31
Wohnort: Lößnitz

Beitrag von degen » 13.02.2006 20:08:15

meandtheshell hat geschrieben: ist nicht notwendig wenn nur ein Kommando übergeben wird

Was den Rest angeht werde ich gleich verrückt - wenn ich wenigstens wüsste wo ich für eine Erklärung von usw. suchen muss.

Die sed manpage und das texinfo manual ist natürlich auch ein Schuß in den Ofen. WTF ...

markus
Hallo meandtheshell,

bevor du hier wahnsinnig wirst, werfe ich einfach mal zwei Links in den Raum die ich mal gefunden hatte. Der erste enthält unter anderem auch kurze Erläuterungen zu /L und /U.

http://linuxseiten.kg-it.de/index.php?i ... Befehl_sed
http://www.tty1.net/sed-tutorium/html/index.html

Da du mich so höflich gebeten hast, habe ich dir beide auch noch mal als PN geschickt.

mfg degen
Irren ist menschlich. Aber wenn man richtig Mist bauen will, braucht man einen Computer.

Benutzeravatar
meandtheshell
Beiträge: 4054
Registriert: 14.01.2005 17:51:30

Beitrag von meandtheshell » 13.02.2006 21:36:19

@degen
danke dir :D

markus

Benutzeravatar
degen
Beiträge: 93
Registriert: 29.01.2005 16:49:31
Wohnort: Lößnitz

Beitrag von degen » 13.02.2006 21:41:21

gern geschehen

mfg
degen :D
Irren ist menschlich. Aber wenn man richtig Mist bauen will, braucht man einen Computer.

Antworten