破線文字列を空白と大文字に変換するには?

破線文字列を空白と大文字に変換するには?

文字列が与えられたら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

関連情報