给定字符串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 shell 中的拆分,您可以执行以下操作:
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
在 shell 中拆分时使用,以避免文件名生成[?*
和引用扩展不打算分裂。
dd
应该注意的是,上面的命令可能只在 ASCII 语言环境中非常有效。在其他方面,您可能应该查看recode
或iconv
或类似的内容。
答案4
步骤1:将 替换-
为空格
为此,您可以使用tr
以下命令:
tr "-" " "
第2步:将每个单词的第一个字母大写
为此,您可以使用查找单词边界\b
并将直接字母设为大写。代表.
单词边界之后紧邻的字母\b
,\U
将其设为大写并将&
字母中的所有其他字母保持原样。
sed -e 's/\b./\U&/g'
查看:
echo "foo-bar-foo-bar" | tr "-" " " | sed -e 's/\b./\U&/g'
Foo Bar Foo Bar