Forum: PC-Programmierung Sed Regex match upper case letters


von Stefan Salewski (Gast)


Lesenswert?

1
$ echo "Dog boy Did Good" | sed 's/[A-Z]/x/g'
2
xxx xxx xxx xxxx
3
$ echo "Dog boy Did Good" | sed 's/[[:upper:]]/x/g'
4
xog boy xid xood

Ich war mir eigentlich fast sicher, dass [A-Z] hier das gleiche tut wie 
[:upper:]]. Wobei letzteres für Umlaute bzw. Unicode vorzuziehen sein 
mag. Aber das erste Ergebnis mit [A-Z] verstehe ich nicht. Das ist für 
gnu sed, der Linux-Rechner hat UTF-8 als Default. Ich habe [A-Z] schon 
oft verwendet, aber womöglich eher mit Perl oder Ruby. Mit Google finde 
ich dazu nicht viel. :upper: tut natürlich genau das was ich will, 
aber das habe ich in ein paar Wochen sicher wieder vergessen. Ich habe 
ja fast den Eindruck dass mein sed kaputt ist?

von LOL (Gast)


Lesenswert?

Kann ich nicht nachvollziehen, wäre auch unlogisch:
1
$ echo "Test UpperCase Replace" | sed 's/[A-Z]/x/g'
2
xest xpperxase xeplace

von Stefan Salewski (Gast)


Lesenswert?

Danke für den Test -- dann ist wohl in der Tat etwas mit meinem sed bzw. 
der locale oder was auch immer defekt. Ich hatte eben mit google etwas 
zu ähnlichen Problemen mit [A-Z] gefunden, aber ohne Lösungsvorschlag. 
Mein OS ist Gentoo AMD64 -- vielleicht ist da beim letzten Update irgend 
etwas verstellt worden.

von Dirk D. (dicky_d)


Lesenswert?

das klingt nach nem locale-problem, was für locales sind den bei dir 
gesetzt?

... du benutzt aber GNU sed, ja?

von Stefan Salewski (Gast)


Lesenswert?

Ja, ist gnu sed.
1
$ eselect locale list
2
Available targets for the LANG variable:
3
  [1]   C
4
  [2]   de_DE
5
  [3]   de_DE@euro
6
  [4]   de_DE.iso88591
7
  [5]   de_DE.iso885915@euro
8
  [6]   deutsch
9
  [7]   en_US
10
  [8]   en_US.iso88591
11
  [9]   en_US.utf8 *
12
  [10]  german
13
  [11]  POSIX
14
  [ ]   (free form)

Unter Gentoo linux kann man das eigentlich ganz gut mit eselect 
einstellen, ist wohl n_US.utf8 gekennzeichnet durch das Sternchen. Ich 
habe mich um die locales in den letzten Jahren nicht groß gekümmert. Sed 
ist da wohl besonders empfindlich. Gut, muss ich mal nachlesen.

von Dirk D. (dicky_d)


Lesenswert?

Stefan Salewski schrieb:
> Ja, ist gnu sed.
Gut, das bsd-sed ist nämlich case-insensitive :/
>
>
1
> $ eselect locale list
2
> Available targets for the LANG variable:
3
>   [9]   en_US.utf8 *
4
5
>
>
> Unter Gentoo linux kann man das eigentlich ganz gut mit eselect
> einstellen, ist wohl n_US.utf8 gekennzeichnet durch das Sternchen. Ich
> habe mich um die locales in den letzten Jahren nicht groß gekümmert. Sed
> ist da wohl besonders empfindlich. Gut, muss ich mal nachlesen.


das sollte eigentlich kein Problem machen, ich hab de_DE.UTF-8 gesetzt, 
bei mir tuts was es soll, ich glaub nicht das das mit en_US anders sein 
soll, da muss irgendwo anders noch nen Wurm drin sein :(

was für ne version hat dein sed den?

von Stefan Salewski (Gast)


Lesenswert?

1
$ sed --version
2
GNU sed version 4.2.1
3
4
$ hexdump -C hhhx
5
00000000  44 6f 67 20 62 6f 79 20  44 69 64 20 47 6f 6f 64  |Dog boy Did Good|
6
00000010  0a                                                |.|
7
00000011
8
stefan@AMD64X2 ~ $ sed "s/[A-Z]/x/g" hhhx
9
xxx xxx xxx xxxx

Ja ich habe es jetzt man direct mit text aus einer Datei probiert, oder 
auch als root mit eselect die locale auf C umgestellt. Hilft nichts. Das 
ist schon etwas seltsam. Vielleicht wirklich mal sed neu installieren?

von Stefan Salewski (Gast)


Lesenswert?

:-)
1
echo "sys-apps/sed" >> /etc/portage/package.accept_keywords
2
emerge -av sed
3
sed --version
4
sed (GNU sed) 4.2.2
5
6
# echo "Dog boy Did Good" | sed 's/[A-Z]/x/g'
7
xog boy xid xood

Neuinstallation der alten Version 4.2.1 hatte nicht geholfen. Da muss 
die alte gnu sed Version tatsächlich einen Fehler gehabt haben. Hätte 
ich nicht gedacht.

von Dirk D. (dicky_d)


Lesenswert?

Tatsache: https://bugs.mageia.org/show_bug.cgi?id=7514

ich hab auch nen 4.2.2, ich hätt gedacht das ist nahe genug dran :)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.