Wie ersetzen Sie den ersten Buchstaben eines Wortes in Großbuchstaben, z.
Trouble me
Gold Rush brides
in
Trouble Me
Gold Rush Brides
Diese Zeile sollte es tun:
sed -e "s/\b\(.\)/\u\1/g"
awk
verwenden:
awk '{for(i=1;i<=NF;i++){ $i=toupper(substr($i,1,1)) substr($i,2) }}1' file
Die Ausgabe wäre:
Trouble Me
Gold Rush Brides
Verwenden Sie den folgenden sed-Befehl, um den ersten Buchstaben jedes Wortes in Großbuchstaben zu schreiben.
echo -e "Trouble me \nGold Rush brides" | sed -r 's/\<./\U&/g'
ausgabe
Trouble Me
Gold Rush Brides
Der Schalter -r
weist sed
an, erweiterte reguläre Ausdrücke zu verwenden. Die Anweisungen an sed
geben dann an " s earch and replace" (die s
am Anfang) das Muster \<.
mit dem Muster \U&
g lobally, dh alle Instanzen in jeder Zeile (das ist der Modifikator g
am Ende). Das Muster, nach dem wir suchen, ist \<.
, das nach einem Wortgrenze (\<
) gefolgt von beliebiges Zeichen (.
). Das Ersetzungsmuster ist \U&
, wobei \U
sed
anweist, den folgenden Text in Großbuchstaben zu schreiben und &
ein Synonym für \0
, das sich auf "alles bezieht, was übereinstimmt". In diesem Fall entspricht "alles, was abgeglichen wurde" genau dem .
, da die Wortgrenzen in den Übereinstimmungen nicht enthalten sind (stattdessen handelt es sich um Anker ). Was mit .
übereinstimmt, ist nur ein Zeichen. Dies ist also das, was in Großbuchstaben geschrieben steht.
Eine weitere kürzere Version mit sed:
sed -e "s/\b./\u\0/g"
Ich hatte Apostrophe und arbeitete die erste Lösung aus ...
[email protected]:~$ echo "BEST WESTERN PLUS BOB's INN" | tr "[A-Z]" "[a-z]" | sed -e "s/\b\(.\)/\u\1/g"
Best Western Plus Bob'S Inn
[email protected]:~$ echo "BEST WESTERN PLUS BOB's INN" | tr "[A-Z]" "[a-z]" | sed "s/\( \|^\)\(.\)/\1\u\2/g"
Best Western Plus Bobs Inn
Ich weiß, Sie sagten sed, aber für Shell-Skripte war Python die einfachste und flexiblere, die in den meisten Systemen verfügbar ist:
$ echo "HELLO WORLD" | python3 -c "import sys; print(sys.stdin.read().title())"
Hello World
Zum Beispiel:
$ lorem | python3 -c "import sys; print(sys.stdin.read().title())"
Officia Est Omnis Quia. Nihil Et Voluptatem Dolor Blanditiis Sit Harum. Dolore Minima Suscipit Quaerat. Soluta Autem Explicabo Saepe. Recusandae Molestias Et Et Est Impedit Consequuntur. Voluptatum Architecto Enim Nostrum Ut Corrupti Nobis.
Sie können auch Dinge wie strip()
verwenden, um Leerzeichen zu entfernen, oder capitalize()
:
$ echo " This iS mY USER ${USER} " | python3 -c "import sys; print(sys.stdin.read().strip().lower().capitalize())"
This is my user jenkins
Die bisher vorgeschlagenen sed
- Lösungen funktionieren nur, wenn der ursprüngliche Text in Kleinbuchstaben geschrieben ist. Obwohl man tr '[[:upper:]]' '[[:lower:]]'
Um die Eingabe in Kleinbuchstaben zu normalisieren, kann es nützlich sein, eine All-in-One-Lösung sed
zu haben:
sed 's/\w\+/\L\u&/g'
Dies passt zu Wörtern (\w
bedeutet Wortzeichen und \+
mindestens ein und bis zum nächsten Nicht-Wort-Zeichen) und Kleinbuchstaben bis zum Ende (\L
) aber Großbuchstaben des nächsten (d. h. ersten) Zeichens (\u
) für jeden (g
) übereinstimmenden Ausdruck (&
).
[ Credits ]
Verwenden von sed mit tr :
name="athens"
echo $name | sed -r "s/^[[:alpha:]]/$(echo ${name:0:1} | tr [[:lower:]] [[:upper:]])/"
Bash benutzen (ohne sed, also ein wenig off topic):
msg="this is a message"
for Word in $msg
do
echo -n ${Word^} ""
done
This Is A Message