特定の単語のみを小文字に変換

特定の単語のみを小文字に変換

var値が . の変数があるとしますfOo bar1 baR2 bArab

lc_varたとえば、最初の単語を除くすべての単語を小文字に変換されたバージョンなど、別の変数に保存するにはどうすればよいですか?var

私はそれが適切なAWKまたはsedコマンドで置き換えられるように見えるかもlc_var=$(echo $var | ...)しれません。...

ベストアンサー1

シェルを含むzsh:

set -o extendedglob
lc_var=${var/%(#m) */${(L)MATCH}}

kshは、${var/%pattern/replacement}一致するvarの末尾をに置き換えて、一致する部分(つまり、必須部分)を保存して小文字に変換します。patternreplacement(#m)$MATCHextendedglob${(L)MATCH}$MATCH

シェルを含むbash:

tmp1=${var%% *}
tmp2=${var#"$tmp1"}
lc_var=$tmp1${tmp2,,}

POSIXlyでは、次のようにします。

lc_var=$(
  awk '
    BEGIN{
      var = ARGV[1]
      if (i = index(var, " "))
        var = substr(var, 1, i) tolower(substr(var, i + 1))
      print var "."
    }' "$var"
)
lc_var=${lc_var%.}

とにかく、これはPOSIX / Korn / bash / zshシェル構文lc_var=$(echo $var ...)のために不可能に見え、$(...)そのシェルではecho任意のデータを出力できませんそして変数拡張を引用する必要があります。(多分除くzsh)。

これらすべてのバリアントは、最初の空白文字の後のすべての文字を小文字に変換します$var(どの文字であるかを想定せずに)。単語がスペース以外の文字で区切られたり、最初の単語の前に単語区切り文字がある場合は、それを調整する必要があります。

おすすめ記事