如何在鱼壳中大写字符串?

时间:2015-12-10 16:50:14

标签: string shell fish capitalization capitalize

我收到了以下文字:

  

Lorem ipsum dolor坐下来,精神恍惚。

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

预期结果

  

Lorem Ipsum Dolor Sit Amet,Consectetur Adipisicing Elit。

等同于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
}

问题

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

4 个答案:

答案 0 :(得分:2)

Fish目前没有任何工具可以执行此操作(在发行版中),所以假设你有GNU sed,你可以这样做:

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

还有其他各种工具,您也可以使用以下工具: python或通过从fish调用bash,重点是无法提取子字符串或用fish builtins替换字符。

在下一个鱼类发布中,您将能够使用string sub -l 1 $i来提取第一个鱼。

答案 1 :(得分:1)

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.

答案 2 :(得分:1)

以前的解决方案都不适合我。 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

仅适用于鱼类2.3.0或更新版本,因为我使用string内置

答案 3 :(得分:0)

使用外部工具(来自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 Elit。