답변:
foo="$(tr '[:lower:]' '[:upper:]' <<< ${foo:0:1})${foo:1}"
notQuiteCamel
했습니다 NotQuiteCamel
. 서브 쉘과 tr 프로세스의 수를 두 배로 증가시키면서, 변종은 부작용을 일으키거나 나머지를 소문자로 강제합니다.
bash
.
bash (버전 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
합니다
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
오 네 둘 셋
변수의 모든 단어 를 대문자로 바꾸려면 :
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는 지금은 "1 2 3"입니다
이것은 나를 위해 일했다 :
현재 디렉토리에서 모든 * 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
}
첫 번째 문자부터 낮은 xc () {v 첫 번째 문자부터 낮은 | xclip-선택 클립 보드}
첫 번째 문자 가 문자 가 아닌 경우 (탭, 공백 및 이스케이프 된 큰 따옴표)는 어떻게됩니까? 편지를 찾을 때까지 시험해 보는 것이 좋습니다 ! 그래서:
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
상황의 예입니다 . 에서 의 내용 은 문자열 분할 및 glob-expanded입니다. 이것은 예제와 나머지 모두에 대해서도 마찬가지입니다 . BashPitfalls # 14를 참조하십시오 . echo ${F}
F
echo ${S:$N:1}