簡體   English   中英

如何在魚殼中大寫字符串?

[英]How to capitalize string in fish shell?

我得到以下文字:

Lorem ipsum dolor坐在amet,consectetur adipisicing elit。

我想要大寫,即每個單詞的大寫第一個字母。

預期結果

Lorem Ipsum Dolor坐在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目前沒有任何工具可以執行此操作(在發行版中),因此假設您有GNU sed,您可以這樣做:

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

還有其他各種工具,您也可以使用例如python或通過從fish調用bash來實現它,重點是無法提取子字符串或用fish builtins替換字符。

在下一個魚類版本中,您將能夠使用string sub -l 1 $i來提取第一個字符。

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.

以前的解決方案都不適合我。 似乎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

由於我使用的是內置string因此僅適用於魚類2.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坐在Amet,Consectetur Adipisicing Elit。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM