【问题标题】:How to capitalize string in fish shell?如何在鱼壳中大写字符串?
【发布时间】:2016-03-16 09:55:58
【问题描述】:

我收到以下文字:

Lorem ipsum dolor sit amet,consectetur adipisicing elit。

我想大写,即每个单词的首字母大写。

预期结果

Lorem Ipsum Dolor Sit Amet,Consectetur Adipisicing 精英。

Bash 等效项

使用bash,我使用的是参数扩展:

function to-lower() { echo "$@" |tr '[:upper:]' '[:lower:]' ; }

function capitalize() {
    input="$(to-lower "$@")"
    for i in $input; do
        cap=$(echo -n "${i:0:1}" | tr "[:lower:]" "[:upper:]")
        echo -n "${cap}${i:1} "
    done
    echo
}

问题

我该如何以鱼的方式做到这一点?

【问题讨论】:

    标签: string shell fish capitalization capitalize


    【解决方案1】:

    Fish 目前没有任何工具可以做到这一点(在一个版本中),所以假设你有 GNU sed 你可以这样做:

    function capitalize
        echo $argv | sed 's/[^ _-]*/\u&/g'
    end
    

    还有各种其他工具,您也可以使用例如python 或通过从fish调用bash,关键是无法提取子字符串或用fish内置函数替换字符。

    在下一个 fish 版本中,您将能够使用 string sub -l 1 $i 提取第一个字符。

    【讨论】:

    • 我真的不喜欢string util,它真的很冗长但晦涩难懂。我可能会坚持使用外部工具解决方案,因为它与外壳无关。
    • 我是porting my existing bash/zsh dotfiles to fish,见.my-posixrc.my-fishrc
    • @faho IDK 为什么但这个解决方案对我不起作用。 Fish v2.3.1 和 gnu-sed 4.2.2
    • 是的,那个正则表达式被破坏了。我已经修好了。
    【解决方案2】:
    function title_case -a string
        echo $string | sed 's/\<[[:alpha:]]/\u&/g'
    end
    title_case 'Lorem ipsum dolor sit amet, consectetur adipisicing elit.'
    
    Lorem Ipsum Dolor Sit Amet, Consectetur Adipisicing Elit.
    

    【讨论】:

      【解决方案3】:

      以前的解决方案都不适合我。 sed 似乎在我的机器上不能正常工作。如果有人遇到任何类似的问题,这是我最终使用的解决方法:

      function title_case -a string
        set -l matches (string match -r -a '\b[a-z]' $string)
      
        for match in $matches
          set -l upper (echo $match | tr a-z A-Z)
          set string (echo (string replace -r '\b[a-z]' $upper $string))
        end
      
        echo $string
      end
      

      仅适用于 fish 2.3.0 或更新版本,因为我使用的是 string 内置

      【讨论】:

      • 我现在已经尝试过了,它似乎可以按预期工作,用户想要标题案例的变体 - 没有例外,并且... - 这就是这个功能的工作原理。也许您想要的是大写函数之类的东西?如果不是这种情况,您使用的是什么版本的鱼壳?
      • 是的,我的错。虽然是 TOUPPER。
      【解决方案4】:

      使用外部工具的解决方案(来自commandlinefu

      function capitalize
          set input "$argv"
          echo "$input" | tr '[A-Z]' '[a-z]' | sed 's/\(^\| \)\([a-z]\)/\1\u\2/g'
      end
      

      用法

      capitalize "Lorem ipsum dolor sit amet, consectetur adipisicing elit."                                                                        
      

      Lorem Ipsum Dolor Sit Amet,Consectetur Adipisicing 精英。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-24
        • 2014-04-24
        相关资源
        最近更新 更多