Archiv verlassen und diese Seite im Standarddesign anzeigen : 1. Zeichen in String auf Groß stellen
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
<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#*||}
firstpart=${1%%||*}
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
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#*||}
firstpart=${Zeile%%||*}
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
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:]]+||[[:alpha:]]+|[[:alpha:]]+$' || continue
#
function to_upper()
...
</pre>
Thomas
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
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.]
@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
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
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
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
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
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
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
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
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.