PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 1. Zeichen in String auf Groß stellen



16-01-2001, 13:30
Hallo,
hat jemand eine Idee, wie man aus einer Zeile:

17026100101|Herr||vorname|nachname

wobei der vorname und nachname Groß- oder Kleingeschrieben sein kann,

17026100101|Herr||Vorname|Nachname
machen kann.

Es sollen jeweils das erste Zeichen groß-, alle weiteren kleingeschrieben sein.

Dabei handelt es sich um eine Datei, in der eine Vielzahl von solchen Zeilen stehen. Wenn jemand noch eine Schleife kennt, noch besser.

Vielen Dank,
Werner

thommy
16-01-2001, 14:44
<pre>
#!/bin/bash
#
function to_upper()
{
echo $1 | tr 'a-z' 'A-Z'
}
#
function to_lower()
{
echo $1 | tr 'A-Z' 'a-z'
}
#
lastpart=${1#*&#0124;&#0124;}
firstpart=${1%%&#0124;&#0124;*}
Vorname=${lastpart%|*}
Nachname=${lastpart#*|}
Vorname1=`to_upper ${Vorname:0:1}`
Vorname2=`to_lower ${Vorname:1}`
Nachname1=`to_upper ${Nachname:0:1}`
Nachname2=`to_lower ${Nachname:1}`
#
echo "$firstpart|$Vorname1$Vorname2|$Nachname1$Nachname2"
</pre>

Nicht besonders elegant, aber funktionell http://www.linuxforen.de/ubb/wink.gif


Thomas

rup
16-01-2001, 18:52
Hallo

Ich habe das Skript von Thomas noch in eine Schleife gepackt.

Gruß Rupert

#!/bin/bash

for Zeile in `cat AlteDatei`
do
function to_upper()
{
echo $1 | tr 'a-z' 'A-Z'
}
#
function to_lower()
{
echo $1 | tr 'A-Z' 'a-z'
}
#
lastpart=${Zeile#*&#0124;&#0124;}
firstpart=${Zeile%%&#0124;&#0124;*}
Vorname=${lastpart%|*}
Nachname=${lastpart#*|}
Vorname1=`to_upper ${Vorname:0:1}`
Vorname2=`to_lower ${Vorname:1}`
Nachname1=`to_upper ${Nachname:0:1}`
Nachname2=`to_lower ${Nachname:1}`
#
echo "$firstpart|$Vorname1$Vorname2|$Nachname1$Nachname2" >> NeueDatei
done

thommy
17-01-2001, 07:32
Aber dann sollte schon getestet werden, ob die Zeile auch dem Muster entspricht:

<pre>
for Zeile in `cat AlteDatei`
do
#
echo $Zeile | egrep -q '^[[:digit:]]+|[[:alpha:]]+&#0124;&#0124;[[:alpha:]]+|[[:alpha:]]+$' &#0124;&#0124; continue
#
function to_upper()
...
</pre>

Thomas

17-01-2001, 07:40
Hallo,
vielen Dank,
ich habe gestern rumprobiert und es folgendermaßen gelöst:

#!/bin/ksh
#
# Sript aendert in der Liste Pstk.TXT die
# an dritter und vierter Stelle stehenden
# Vor- und Nachnamen so ab, dass jeweils
# das erste Zeichen gross ist, alle anderen
# kleingeschrieben sind
#
# Author Werner
#
# Stand 17.01.2001
#

# Aenderung des Feldtrenners von "Blank" oder
# "Tab" zu "|"
OLDIFS=$IFS
IFS="|"
# Ausgabe der Datei Pstk.TXT
# Einlesen der Felder ein, zwei, drei,
# vorname, nachname und allas am Ende in rest
cat /root/batches/geburtstag/Pstk.TXT | while read ein zwei drei vorname nachname rest
do
# in die Variable ve_laenge wird die um eins
# reduzierte Zeichenanzahl von dem im Feld
# vorname stehenden Wert geschrieben
ve_laenge=`expr ${#vorname} - 1`
# in die Variable ne_laenge wird die um eins
# reduzierte Zeichenanzahl von dem im Feld
# nachname stehenden Wert geschrieben
ne_laenge=`expr ${#nachname} - 1`
# das erste Zeichen von den Feldern vorname
# und nachname werden in Grossbuchstaben umgewandelt
# -u gross; -L1 ein Zeichen von links
typeset -uL1 v=$vorname
typeset -uL1 n=$nachname
# alle Zeichen von den Feldern vorname und
# nachname nach dem ersten Zeichen werden in Klein-
# buchstaben umgewandelt
# -l klein; -R$ve_laenge die Laenge des Wertes um
# eins reduziert (siehe oben) von Rechts
typeset -lR$ve_laenge ve=$vorname
typeset -lR$ne_laenge ne=$nachname
# Ausgabe der Werte in test.txt
echo "$ein|$zwei|$drei|$v$ve|$n$ne|$rest" >>test.txt
done


IFS=$OLDIFS

Grüße,
Werner

rup
17-01-2001, 18:55
Hallo Thomas

nicht so schnell ich bin noch am lernen und üben, bin schon stolz das ich die Schleife geschafft habe http://www.linuxforen.de/ubb/wink.gif

Gruß Rupert

[Dieser Beitrag wurde von rup am 17. Januar 2001 editiert.]

thommy
18-01-2001, 07:23
@wer_ner

Bitte gib das nächste Mal an, dass Du die Korn Shell meinst. typeset kennt in der Bash keine Optionen zur Wandlung in Klein- oder Großbuchstaben. Deshalb die Lösung mittels Parameterexpansion.

Thomas

18-01-2001, 07:38
Hallo Tommy,
ich werde mich bemühen, aber so allgemein, ich versuche nur diese zu verwenden, da mir geraten wurde dies zu tun, um kompatibel zu anderen Unix`en zu bleiben.
Manche Sachen laufen dann auch gleich woanders.

War aber sicher nicht bös gemeint. Worum ich Dich bitten wollte, ist um eine kurze Doku zu Deiner Lösung. Ich verstehe ehrlich gesagt nur Bahnhof.

Grüße,
Werner

22-01-2001, 18:16
geht auch kürzer....



#!/usr/bin/perl
# datei einlesen
$buffer=`cat /deine_datei_mit den zeilen`;
# Ersetzten
$buffer=~s/\|(\w)/\|\u$1/g;
#print $buffer ;
#in newfile schreiben
exec("echo \"$buffer\" > newfile");

olli

24-01-2001, 13:37
Hallo,
mein Problem hat sich etwas erweitert.
Natürlich gibts auch Doppelnamen, bei denen in meinem Script die "Zweitnamen" nach dem "-" kleingeschrieben bleiben.

z.B.:Eva-maria|Musterfrau-mustermann

gewünscht wäre: Eva-Maria|Musterfrau-Mustermann

Hat jemand eine Lösung, wie auch das in den Griff bekommen kann?
MfG,
Werner

thommy
24-01-2001, 15:12
Mit fehlt jetzt die Zeit, die Lösung aufzuschreiben, aber Du kannst nach dem selben Schema vorgehen.

Im bisherigen Skript wurden die Zeile in die Teile "Prefix", "Vorname", "Nachname" zerlegt.

Anstatt diese nun sofort zu Verarbeiten, "grepst" (kurioses Wortgebilde http://www.linuxforen.de/ubb/wink.gif) Du in Vorname und Nachname nach dem Bindestrich. Taucht er auf, teilst Du die Zeichenketten nochmals und verfährst genauso.

Dann solltest Du nur noch hoffen, dass unsere Politikerinnen nicht bei jeder Heirat ihre bisherigen Namen verlängern. Sonst reicht die Suche nach einem "-" nicht mehr http://www.linuxforen.de/ubb/wink.gif

Thomas

24-01-2001, 16:50
Hallo,
ich habe jetzt folgendes eingebaut:


IFS="-"
set $ve
IFS="|"
if [ "$2" != "" ] ;
then
vve_laenge=`expr ${#2} - 1`
typeset -uL1 vv=$2
echo "\$2 ist $2 "
echo "vv = $vv"
echo "\$vve_laenge = $vve_laenge "
typeset -lR$vve_laenge vve=$2
strich="-"
echo "\$1 ist $1 "
test=$(echo "$1|$strich|$vv|$vve")
echo "test = $test"
echo "\$vve = $vve"
ve=$(echo $1""$strich""$vv""$vve)
echo $ve
echo $v$ve
fi

IFS="|"


Die Zeilen befinden sich direkt vor dem ausgebenden Echo in meiner obrigen Lösung.

Interessant ist, daß die Variable $test alles richtig ausgibt, allerdings mit "|" dazwischen, aber dann der erste Buchstabe vom 2. Vornamen wieder klein ist.

Wieso?
Grüße,
Werner

25-01-2001, 07:11
Hallo,
ich hab rausbekommen, was nicht geht, aber warum es nicht geht, würde mich auch interessieren.
Die Variable $ve ist weiter oben schon definiert und wird dann durch set in einzelne Teile zerlegt.
Dieser Variablen kann ich keinen neuen Wert zuweisen.
Ein "unset ve" mit anschließender Zuweisung läuft dann.
Weiß jemand wieso das so ist?
Grüße,
Werner

29-01-2001, 10:39
Hi,
weiß wirklich niemand, warum man eine Variable nicht mit einem Wert neu füllen kann, sondern vorher einen unset machen muß?
Grüße,
Werner