문자열이 주어지면 foo-bar
이를 변환하는 좋은 방법은 무엇입니까 Foo Bar
?
Bash, OSX를 사용하세요.
답변1
먼저 대시를 공백으로 변경합니다. 예를 들면 다음과 같습니다.
sed 's/-/ /g'
첫 글자를 대문자로 표기하는 것은이미 해결됨(투표하거나 이 질문을 이 질문의 중복으로 표시하십시오).
그런 다음 이를 결합합니다.
sed -e 's/-/ /g' -e 's/\b\(.\)/\u\1/g'
$ echo "foo-bar-baz-nonce" | sed -e 's/-/ /g' -e 's/\b\(.\)/\u\1/g'
Foo Bar Baz Nonce
$
답변2
사용하는 솔루션진주, "foo-bar"에만 국한되지 않음
$ cat file
aaa-zzz-eee-rrr
foo-bar
암호
$ perl -ne 'print join " ", map { ucfirst } split /-/' file
Aaa Zzz Eee Rrr
Foo Bar
순수 bash를 사용하는 또 다른 솔루션
while IFS='-' read -r -a words; do
printf '%s\n' "${words[@]^}" | paste -sd ' '
done < file
산출:
Aaa Zzz Eee Rrr
Foo Bar
답변3
POSIX 셸에서 분할하려면 다음을 수행할 수 있습니다.
set -f; IFS=-; set -- $1; IFS=' '
이제 모든 대시는 공백이므로 전체 문자열을 입력 "$*"
하거나 각 공백(그 앞의 대시)이 문자열을 구분할 수 있습니다 $1
$2
$3
.(전체 금액은 에서 확인하실 수 있습니다 "$#"
) 또는확장 가능한 매개변수 목록으로 얻을 수 있습니다 "$@"
.
이제 대소문자 변환을 위해 다음을 수행할 수 있습니다.
IFS='
'; for c in $(printf %.1s "$@" | dd cbs=1 conv=unblock,ucase)
do set -- "$@" "$c${1#[!"$IFS"]}"; shift; done
다음은 전체 내용의 예입니다.
set -f -- aaa-zzz-eee-rrr-foo-bar
IFS=-; set -- $1; IFS='
'; for c in $(printf %.1s "$@" | dd cbs=1 conv=unblock,ucase)
do set -- "$@" "$c${1#?}"
shift; done; printf %s\\n "$@"
인쇄:
Aaa
Zzz
Eee
Rrr
Foo
Bar
...이것은 공백으로 구분되지 않는다는 것을 알고 있습니다 . 첫 번째 바이트를 공백으로 설정했기 때문에 "$@"
공백으로 구분되었습니다 . 구분 기호는 그런 식으로 정의할 수 있습니다. 예를 들어:"$*"
$IFS
IFS=k; printf %s\\n "$*"; IFS=' '; printf %s\\n "$*"
...인쇄...
AaakZzzkEeekRrrkFookBar
Aaa Zzz Eee Rrr Foo Bar
물론 언제든지 저장할 수 있습니다.
IFS=-; dashes="$*"; IFS=' '; spaces="$*"; IFS=; empty="$*"
printf %s\\n "$dashes" "$spaces" "$empty"
...인쇄:
Aaa-Zzz-Eee-Rrr-Foo-Bar
Aaa Zzz Eee Rrr Foo Bar
AaaZzzEeeRrrFooBar
이는 더 복잡한 주제이지만 이러한 영역에서 큰 역할을 할 수 있습니다. 그러나 데이터 무결성을 보호하는 것이 중요합니다. 파일 이름 생성 및 인용 확장을 set -f
방지하려면 셸에서 분할할 때 사용하세요.[?*
아니요분할할 계획입니다.
dd
위 명령은 ASCII 로케일에서만 제대로 작동할 수 있다는 점에 유의해야 합니다. 다른 곳에서는 아마도 체크아웃 recode
하거나 iconv
비슷한 것을 해야 할 것입니다.
답변4
1 단계:-
공백으로 대체됩니다
이렇게 하려면 tr
다음 명령을 사용할 수 있습니다.
tr "-" " "
2 단계:각 단어의 첫 글자를 대문자로 표기
단어 경계 찾기를 사용 \b
하고 직접 문자를 대문자로 만들어 이를 수행할 수 있습니다. .
border 단어 바로 뒤의 문자를 나타내며 \b
, \U
문자는 대문자로 만들고 &
문자의 다른 모든 문자는 그대로 둡니다.
sed -e 's/\b./\U&/g'
확인하다:
echo "foo-bar-foo-bar" | tr "-" " " | sed -e 's/\b./\U&/g'
Foo Bar Foo Bar