如何在Fish Shell中将字符串转换为大写?

7

我得到了以下文本:

Lorem ipsum dolor sit amet, consectetur adipisicing elit.

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

期望结果

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
}

问题

我如何以 fish-way 的方式进行操作?

4个回答

2

目前Fish还没有相关工具(在发布版本中),因此假设你有GNU sed,你可以这样做:

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

除此之外,还有许多其他工具可以使用,例如Python或通过在fish中调用Bash,重点是没有一种方法可以使用fish内置函数提取子字符串或替换字符。

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


我真的不喜欢 string 工具,它非常冗长而晦涩。我可能会坚持使用外部工具解决方案,因为它与 shell 无关。 - Édouard Lopez
我正在将我的现有的bash/zsh dotfiles移植到fish,参见.my-posixrc.my-fishrc - Édouard Lopez
@faho 我不知道为什么,但这个解决方案对我不起作用。Fish v2.3.1和gnu-sed 4.2.2。 - Alex Guerrero
1
是的,那个正则表达式有问题。我已经修复了它。 - faho

1

使用外部工具的解决方案(来自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是指一篇常用于排版设计领域的拉丁文文章,也常用于测试不同字体和排版方式的样例文本。


1
您可以使用正则表达式的字符串替换功能来实现这一点:
$ string replace -r -a '\b([\w])' '\U$0' "Lorem ipsum dolor sit amet, consectetur adipisicing elit."
Lorem Ipsum Dolor Sit Amet, Consectetur Adipisicing Elit.

Wait, forgot to escape a space. Wheeeeee[taptaptap]eeeeee.


1
这是正确的答案。我很惊讶答案竟然会是在一个与鱼有关的问题中使用 sed。我总是推荐使用 string - mattmc3

0

之前的解决方案都不适用于我。看起来在我的机器上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内置函数


我现在已经尝试了一下,看起来它按预期工作。用户希望有一个变体的标题大小写 - 不包含诸如"the"和"and"之类的例外情况 - 而这个函数就是这样实现的。也许你想要的是一个类似于大写字母的函数?如果不是这种情况,你使用的fish shell版本是哪个? - Alex Guerrero
是的,我的错误。我以为是TOUPPER。 - Olivier Refalo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接