2016-09-28 1 views
2

Ist ein Ausdruck wieBash Parameter Substitution und Expansion in einem Rutsch

a=(asd fgh ijk); b=${a[@]:1:${#a[@]}^}; 

irgendwie in bash beschreibbar?

Ich würde erwarten, dass es den ersten Buchstaben jedes Wortes nach dem ersten Großbuchstaben kapitalisiert.

(Ich weiß, wie es in mehreren Ausdrücke zu tun, aber ich würde gerne wissen, wie es zu tun, indem die beiden Funktionen kombiniert (Expansion und Substitution), wenn möglich ...)

+0

Meinst du: um 'asd Fgh Ijk' zu bekommen? – sorontar

+0

@sorontar genau. –

+0

Ja, aber zusätzlich möchte ich das erste Wort (im selben Ausdruck) überspringen. Ist das möglich? –

Antwort

3

Es ist ein Weg, wenn das erste Element das ist nur eine, um mit diesem Zeichen zu beginnen:

$ a=(asd fgh ijk) 
$ echo "${a[@]^[!${a:0:1}]}" 
asd Fgh Ijk 

Dies extrahiert das allererste Zeichen des ersten Elements und schließt dann aus, dass dieses Zeichen in Großbuchstaben geschrieben ist. [!${a:0:1}] erweitert sich zu [!a], die nur f und i als die ersten Zeichen ihrer Elemente übereinstimmen.

Es schlägt fehl, wenn mehrere Elemente mit dem gleichen Zeichen beginnen, aber:

$ a=(asd agh ijk) 
$ echo "${a[@]^[!${a:0:1}]}" 
asd agh Ijk 
+0

Es ist fast das, was ich wollte (simulieren, Kamel Fall in "One Go" zu senken). Leider würde die von Ihnen erwähnte Ausnahme nicht funktionieren. –

1

keine doppelte Substitution , aber eine kurze Lösung:

Um shift Vorteil zu haben, können wir die Positionsparameter anstelle eines Arrays verwenden.

set -- asd fgh ijk; 
b=$1; shift; printf '%s ' "$b" "${@^}" 

Definieren einer Funktion:

$ cc(){ local b=$1; shift; printf '%s ' "$b" "${@^}"; } 
$ cc asd fgh ijk 
asd Fgh Ijk 

Wenn Sie die Wörter als eine lange Zeichenfolge benötigen, ersetzen '%s ' mit '%s':

$ cc(){ local b=$1; shift; printf '%s' "$b" "${@^}"; } 
$ cc asd fgh ijk 
asdFghIjk 
+0

@ASDFGHJKL Eine neue Herangehensweise an das Problem. Ganz einfach IMO. – sorontar

2

Titel Fall der gesamte Zeichenkette, dann das erste Zeichen wechseln?

declare -c a 
a=(asd agh ijk) 
b="${a[0]~} ${a[@]:1}" 
+0

Was macht 'declare -c'? Ich kann die Dokumentation dafür nicht finden. –

+1

@ BenjaminW. [Aktiviert den Titel (zB "Capital Case").] (Http://git.savannah.gnu.org/cgit/bash.git/tree/builtins/declare.def#n208) Siehe auch '-l' und' -u'. – bishop

+0

Diese beiden sind dokumentiert;) –

Verwandte Themen