【问题标题】:bash - dash case to camel casebash - 破折号案例到骆驼案例
【发布时间】:2018-11-13 01:56:31
【问题描述】:

我写了以下内容将foo-bar-baz 转换为FooBarBaz

sed -r 's/^(.)|-(.)/\U\1\U\2/g'

(以上如有错误欢迎指正)

但是,它不适用于busybox :(

我可以用cutfor 循环、bash 子字符串和tr 拼凑一些东西,但是必须有一个很好的使用busybox 版本的sed、awk 等的衬垫。想法?

【问题讨论】:

  • 如果busybox 不理解\U(很可能),那么sed 解决方案将无法工作。
  • 您可能希望限制 (.) 使其仅匹配字母,甚至仅匹配小写字母。如果允许的话,也许还有数字? ([a-z0-9])

标签: bash awk sed tr busybox


【解决方案1】:

我发现了一个将每个单词的首字母大写的 awk 脚本。我使用tr 将破折号转换为空格,运行我窃取的脚本,然后使用tr 删除空格:

echo "foo-bar-baz" \
    | tr '-' ' ' \
    | awk '{for(i=1;i<=NF;i++){ $i=toupper(substr($i,1,1)) substr($i,2) }}1' \
    | tr -d ' '

注意,这只是我写的第二个awk 脚本,所以不能保证

不过,一定有更好的方法。 . .

【讨论】:

    【解决方案2】:

    考虑到您的实际 Input_file(data) 与显示的示例相同,如果是,那么关注 awk(s) 可能会对您有所帮助。

    echo "foo-bar-baz" |
    awk -F"-" '{for(i=1;i<=NF;i++){$i=toupper(substr($i,1,1)) substr($i,2)}} 1' OFS=""
    

    解决方案 2:awk 中使用 RSFSORS

    echo "foo-bar-baz" | 
    awk 'BEGIN{FS="";RS="-";ORS=""} {$0=toupper(substr($0,1,1)) substr($0,2)} 1'
    

    【讨论】:

    • 酷。我不知道你可以控制awk的IFS和OFS。这让我摆脱了解决方案中的tr 部分。谢谢!
    • @Dave,是的,我们可以做的远不止这些 :) 也尝试选择一个正确的答案(在你的帖子的某个时间之后)以完全关闭线程,欢呼和快乐的学习。
    • 如果您想要经典的驼峰式大小写(=首字母小写),请将for(i=1 更改为for(i=2
    猜你喜欢
    • 2014-09-14
    • 2017-05-08
    • 1970-01-01
    • 2020-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-21
    相关资源
    最近更新 更多