如何将虚线字符串转换为空格和大写字母?

如何将虚线字符串转换为空格和大写字母?

给定字符串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 语言环境中非常有效。在其他方面,您可能应该查看recodeiconv或类似的内容。

答案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

相关内容