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