점선 문자열을 공백과 대문자로 변환하는 방법은 무엇입니까?

점선 문자열을 공백과 대문자로 변환하는 방법은 무엇입니까?

문자열이 주어지면 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

관련 정보