回答:
foo="$(tr '[:lower:]' '[:upper:]' <<< ${foo:0:1})${foo:1}"
notQuiteCamel
したいとしNotQuiteCamel
ます。バリアントには副作用があり、残りを小文字にする必要があります-サブシェルとtrプロセスの数を2倍にすることを犠牲にして。
bash
。
bashによる1つの方法(バージョン4+):
foo=bar
echo "${foo^}"
プリント:
Bar
"${foo,}"
。すべての文字を小文字にするには、を使用します"${foo,,}"
。すべての文字を大文字にするには、を使用します"${foo^^}"
。
${foo~}
およびと${foo~~}
同じ効果が ${foo^}
あり${foo^^}
ます。しかし、その代替案がどこかで言及されたことはありませんでした。
bad substitution
片道sed
:
echo "$(echo "$foo" | sed 's/.*/\u&/')"
プリント:
Bar
brew install coreutils gnu-sed
の指示に従い、接頭辞なしのコマンドを使用しますg
。GNUバージョンを取得して以来、これらのコマンドのOSXバージョンを実行したくありませんでした。
sed
この場合はGNUが必要になります
sed 's/./\U&/
、POSIX sedで動作します。
これが「ネイティブ」テキストツールの方法です。
#!/bin/bash
string="abcd"
first=`echo $string|cut -c1|tr [a-z] [A-Z]`
second=`echo $string|cut -c2-`
echo $first$second
tr [:lower:] [:upper:]
文字を組み込んだ言語/ロケールで動作する必要がある場合は、より良い選択です。a-z
A-Z
awkのみを使用する
foo="uNcapItalizedstrIng"
echo $foo | awk '{print toupper(substr($0,0,1))tolower(substr($0,2))}'
これは、bash-3.2を使用した純粋なbashでも実行できます。
# First, get the first character.
fl=${foo:0:1}
# Safety check: it must be a letter :).
if [[ ${fl} == [a-z] ]]; then
# Now, obtain its octal value using printf (builtin).
ord=$(printf '%o' "'${fl}")
# Fun fact: [a-z] maps onto 0141..0172. [A-Z] is 0101..0132.
# We can use decimal '- 40' to get the expected result!
ord=$(( ord - 40 ))
# Finally, map the new value back to a character.
fl=$(printf '%b' '\'${ord})
fi
echo "${fl}${foo:1}"
foo = $1
が、しか得られなかった-bash: foo: command not found
=
割り当て内のスペースなし。これは、shellcheck.netがプログラムで見つけるものです。
=
プログラムへの引数として渡すことができなかったからですsomeprogram =
(実行されているかどうかsomeprogram
、または名前が付けられた変数に割り当てるかどうかを知るにはどうすればよいsomeprogram
ですか)
これも動作します...
FooBar=baz
echo ${FooBar^^${FooBar:0:1}}
=> Baz
FooBar=baz
echo ${FooBar^^${FooBar:1:1}}
=> bAz
FooBar=baz
echo ${FooBar^^${FooBar:2:2}}
=> baZ
等々。
出典:
はじめに/チュートリアル:
最初の単語のみを大文字にするには:
foo='one two three'
foo="${foo^}"
echo $foo
Oの NE 2 3
変数内のすべての単語を大文字にするには:
foo="one two three"
foo=( $foo ) # without quotes
foo="${foo[@]^}"
echo $foo
O NE T WO Tの HREE
(bash 4+で動作)
foo='one two three'; foo=$(for i in $foo; do echo -n "${i^} "; done)
すべての単語の短い解決。foo Now is "One Two Three"
これは私のために働きました:
現在のディレクトリですべての* phpファイルを検索し、各ファイル名の最初の文字を大文字に置き換えます。
例:test.php => Test.php
for f in *php ; do mv "$f" "$(\sed 's/.*/\u&/' <<< "$f")" ; done
正確には尋ねられたものではないが、非常に役立つ
declare -u foo #When the variable is assigned a value, all lower-case characters are converted to upper-case.
foo=bar
echo $foo
BAR
そしてその逆
declare -l foo #When the variable is assigned a value, all upper-case characters are converted to lower-case.
foo=BAR
echo $foo
bar
first-letter-to-lower () {
str=""
space=" "
for i in $@
do
if [ -z $(echo $i | grep "the\|of\|with" ) ]
then
str=$str"$(echo ${i:0:1} | tr '[A-Z]' '[a-z]')${i:1}$space"
else
str=$str${i}$space
fi
done
echo $str
}
first-letter-to-upper-xc () {
v-first-letter-to-upper | xclip -selection clipboard
}
first-letter-to-upper () {
str=""
space=" "
for i in $@
do
if [ -z $(echo $i | grep "the\|of\|with" ) ]
then
str=$str"$(echo ${i:0:1} | tr '[a-z]' '[A-Z]')${i:1}$space"
else
str=$str${i}$space
fi
done
echo $str
}
first-letter-to-lower-xc(){v-first-letter-to-lower | xclip -selectionクリップボード}
最初の文字が文字ではない(タブ、スペース、エスケープされた二重引用符である)場合はどうなりますか?手紙が見つかるまでテストした方がいいです。そう:
S=' \"ó foo bar\"'
N=0
until [[ ${S:$N:1} =~ [[:alpha:]] ]]; do N=$[$N+1]; done
#F=`echo ${S:$N:1} | tr [:lower:] [:upper:]`
#F=`echo ${S:$N:1} | sed -E -e 's/./\u&/'` #other option
F=`echo ${S:$N:1}
F=`echo ${F} #pure Bash solution to "upper"
echo "$F"${S:(($N+1))} #without garbage
echo '='${S:0:(($N))}"$F"${S:(($N+1))}'=' #garbage preserved
Foo bar
= \"Foo bar=
$[...]
)を使用しています。無駄な括弧をたくさん使っています。文字列がラテンアルファベットの文字で構成されていると想定しています(アクセント付きの文字、または他のアルファベットの文字はどうですか)。このスニペットを使用可能にするために多大な労力を費やしています!(そして、正規表現を使用しているので、ループの代わりに正規表現を使用して最初の文字を見つけることもできます)。
tr
:if [[ $S =~ ^([^[:alpha:]]*)([[:alpha:]].*) ]]; then out=${BASH_REMATCH[1]}${BASH_REMATCH[2]^}; else out=$S; fi; printf '%s\n' "$out"
echo $foo
、状況の一例であるパーサが単語のリストを期待します。したがってecho ${F}
、のコンテンツF
は文字列分割され、グロブ展開されます。これは、このecho ${S:$N:1}
例と残りのすべてについても同様です。BashPitfalls#14を参照してください。